vector常用方法


assign() 对Vector中的元素赋值

void assign( input_iterator start, input_iterator end ); //
void assign( size_type num, const TYPE &val );

reserve() 设置Vector最小的元素容纳数量 函数为当前vector预留至少共容纳size个元素的空间.(译注:实际空间可能大于size)

resize() 改变Vector元素数量的大小 函数改变当前vector的大小为size,且对新创建的元素赋值val

swap() 交换两个Vector

capacity() 返回vector所能容纳的元素数量(在不重新分配内存的情况下)

max_size() 返回Vector所能容纳元素数量的最大值(译注:包括可重新分配内存).

size() 返回Vector元素数量的大小

get_allocator() 返回vector的内存分配器

http://blog.csdn.net/qingqinglanghua/article/details/5035763

vector.reserve(size)和vector.resize(size,t*)的区别


reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。下面是这两个函数使用例子:

vector<int> myVec;
myVec.reserve( ); // 新元素还没有构造,
// 此时不能用[]访问元素
for (int i = ; i < ; i++ )
{
myVec.push_back( i ); //新元素这时才构造
}
myVec.resize( ); // 用元素的默认构造函数构造了两个新的元素
myVec[] = ; //直接操作新元素
myVec[] = ;

初始化及清零


二维vector的初始化:

定义空二维vector,再赋值

vector<vector <int> > ivec(m ,vector<int>(n)); //m*n的二维vector,注意两个 "> "之间要有空格!
void assign(const_iterator first, const_iterator last); void assign( size_type _Count, const Type& _Val ); // 赋值,用指定元素序列替换容器内所有元素
vector<vector <int> > ivec(m ,vector<int>(n,0)); //m*n的二维vector,所有元素初始化为0

1.将一个容器初始化为另一个容器的副本

2.初始化为一段元素的副本

3.分配和初始化指定数目的元素

vector<string> v1;         // 创建空容器,其对象类型为string类
vector<int> ivec;
vector<int> ivec2(ivec); //1 vector<string> v4(v3.begin(), v3.end()); // v4是与v3相同的容器(完全复制) //2
vector<string> v2(); // 创建有10个具有初始值(即空串)的string类对象的容器 //3
vector<string> v3(, "hello"); // 创建有5个值为“hello”的string类对象的容器 //3

其中2还可以通过使用内置数组中的一对指针初始化容器,示例如下:

char *words[] = {"stately", "plump", "buck", "mulligan"};
// calculate how many elements in words
size_t words_size = sizeof(words)/sizeof(char*);
// use entire array to initialize words2
vector<string> words2(words, words+words_size); //其中第二个指针words+words_size提供停止复制的条件,其所指向的位置上存放的元素并没有复制

使用STL vector的几种清空容器(删除)办法

iterator erase(iterator it); // 删除指定元素,并返回删除元素后一个元素的位置(如果无元素,返回end())
iterator erase(iterator first, iterator last); // 注意:删除元素后,删除点之后的元素对应的迭代器不再有效。 void clear() const; // 函数删除当前vector中的所有元素,相当于调用erase( begin(), end())

http://hi.baidu.com/ljjyxz123/blog/item/c3bab7f50aabbc05bd31096e.html

assign和resize


template <class InputIterator>
void assign ( InputIterator first, InputIterator last );
void assign ( size_type n, const T& u ); assign() 函数要么将区间[first, last)的元素赋到当前vector,或者赋n个值为u的元素到vector中.这个函数将会清除掉为vector赋值以前的内容.
注意:assign操作首先删除vector容器内的所有元素,然后将参数指定的新元素插入到该容器中。 参数
first, last
标记一段范围的一对迭代器,即将[first,last)标记范围内所有元素复制到当前的vector中.包含first所指向的元素,不包含last所指向的元素。 n,u
表示将当前vector中重新设置为存储n个值为t的元素
void resize ( size_type sz, T c = T() );

改变长度
把当前 vector容器的的长度大小重设为sz
如果sz小于当前vector容器的size,则删除多出来的元素,否则采用值为 T 来初始化新添加的元素 参数 sz
要设置当前vector的size的值
Member type size_type is an unsigned integral type. c
用初始化的新添加的元素的值。
可为空,为空则表示采用值初始化来初始化新添加的元素

resize函数有2个重载版本,一个只有一个size_type参数,一个除了size_type参数外还有_Ty _val,即“可选”新元素值。

先说第一个版本:

void resize(size_type _Newsize)
{ // determine new length, padding with _Ty() elements as needed
resize(_Newsize, _Ty());
}

可见它用_Ty()做第2个参数,调用了它的第2个版本。第2个版本的定义如下:

void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}

由定义可知,对于第一个版本:

若_Newsize小于oldsize,则剩余元素值不变。

若_Newsize大于oldsize,则新添加的元素值用元素的默认构造参数初始化(特别的,int型的将被初始化为0)。

对于第2个版本:

若_Newsize小于oldsize,则剩余元素值不变。(全部调用erase(begin() + _Newsize, end())擦除掉多余元素)

若_Newsize大于oldsize,则新添加的元素值用提供的第2个参数初始化。

不管用哪个版本,[0,min(_Newsize,oldsize))范围内的值均保持不变。

capcity和size


CAPCITY是此容器当前可以容纳的最大元素个数,就是不用重新分配内存是可以容纳的个数 
SIZE是现在容器中已经存在的元素个数
所以容量>=长度

vector <int> a(10); 
a.push_back(1); 
此时a.size()=1,a.capacity()=10

reverse和resize


vector 的reverse只是增加了vector的capacity,但是size没有改变!
resize同时改变了vector的capacity和size!

reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。

resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。

再者,两个函数的形式是有区别的,reserve函数之后一个参数,即需要预留的容器的空间;resize函数可以有两个参数,第一个参数是容器新的大小,第二个参数是要加入容器中的新元素,如果这个参数被省略,那么就调用元素对象的默认构造函数。

vector<int> myVec;
myVec.reserve( ); // 新元素还没有构造,
// 此时不能用[]访问元素
for (int i = ; i < ; i++ )
{
myVec.push_back( i ); //新元素这时才构造
}
myVec.resize( ); // 用元素的默认构造函数构造了两个新的元素
myVec[] = ; //直接操作新元素
myVec[] = ;

为实现resize的语义,resize接口做了两个保证:

一是保证区间[0, new_size)范围内数据有效,如果下标index在此区间内,vector[indext]是合法的。
二是保证区间[0, new_size)范围以外数据无效,如果下标index在区间外,vector[indext]是非法的。

reserve只是保证vector的空间大小(capacity)最少达到它的参数所指定的大小n。在区间[0, n)范围内,如果下标是index,vector[index]这种访问有可能是合法的,也有可能是非法的,视具体情况而定。

resize和reserve接口的共同点是它们都保证了vector的空间大小(capacity)最少达到它的参数所指定的大小。

http://blog.sina.com.cn/s/blog_749f55cd0100p5qw.html

http://bbs.bccn.net/thread-91130-1-1.html

vector list 赋值速度比较


v2 = v1;//用赋值操作符赋值vector()(3rd)

l2 = l1;//用赋值操作符赋值list

v2.assign(v1.begin(), v1.end());//用assign给vector赋值(1st)

l2.assign(l1.begin(), l1.end());//用assign给list赋值

copy(v1.begin(), v1.end(), inserter(v2, v2.begin()));//用copy算法给vector赋值(插入迭代器方式)(5nd)

copy(l1.begin(), l1.end(), inserter(l2, l2.begin()));//用copy算法给list赋值(插入迭代器方式)

v2.resize(v1.size());

copy(v1.begin(), v1.end(), v2.begin());//用copy算法给vector赋值(resize)(2nd)

l2.resize(l1.size());

copy(l1.begin(), l1.end(), l2.begin());//用copy算法给list赋值(resize)

v2.assign(l1.begin(), l1.end());//用assign给vector赋值(从list)(4st)

l2.assign(v1.begin(), v1.end());//用assign给list赋值(从vector)

总结:
vector:对于vector赋值方式中,assign的速度是最快的,其次是resize以后用copy算法赋值,而最先能够想到的赋值操作符,速度却并不快,只能够排名第三,目前还不知道这是为什么,采用插入迭代器再用copy的方式是速度最慢的一种。
list:对于list赋值,赋值操作符的速度是最快的,其次是assign,然后是采用resize的copy,最后一位同样是采用插入迭代子方式的copy。

主要引自:http://www.cnblogs.com/wei-li/archive/2012/06/08/2541576.html

vector的主要操作的更多相关文章

  1. 1555: Inversion Sequence (通过逆序数复原序列 vector的骚操作!!!)

    1555: Inversion Sequence Submit Page    Summary    Time Limit: 2 Sec     Memory Limit: 256 Mb     Su ...

  2. java中vector与hashtable操作详解

    众所周知,java中vector与hashtable是线程安全的,主要是java对两者的操作都加上了synchronized,也就是上锁了.因此 在vector与hashtable的操作是不会出现问题 ...

  3. std::vector 两种操作的比较

    swap assign 这里只想说明这三种操作的用处和效率.swap和assign都可以用在将一个vector的内容全部复制给另外一个vector,区别是swap会改变源vector,而assign会 ...

  4. C++中标准容器Vector,元素操作.insert()小结

    insert() 函数有以下三种用法: iterator insert( iterator loc, const TYPE &val );  //在指定位置loc前插入值为val的元素,返回指 ...

  5. C++vector针对排序操作练习

    目的: 定义5个学生,包含名字和分数,对成员进行从大到小排序,并输出 #include <iostream> #include <cstring> #include <v ...

  6. C++ vector容器删除操作

    1.vector::pop_back() 删除vector的最后一个元素,vector的大小减一,删了的元素被销毁. 2.vector::erase() iterator erase (iterato ...

  7. vector 与map的下标操作

    1.vector的下标操作不会添加元素,只能针对已经存在的元素操作. 2.map的下标操作具有副作用,key不存在,会在map中添加一个具有该key的新元素,新元素的value使用默认构造方法. 3. ...

  8. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  9. 【C++】STL,vector容器操作

    C++内置的数组支持容器的机制,但是它不支持容器抽象的语义.要解决此问题我们自己实现这样的类.在标准C++中,用容器向量(vector)实现.容器向量也是一个类模板.标准库vector类型使用需要的头 ...

随机推荐

  1. Wijmo 5 与Breeze 的组合,及与METRONIC 的集成

    1.Wijmo 5  是支持ANGULARJS 的HTML5 控件   http://wijmo.gcpowertools.com.cn/ 官方试用版  C1Wijmo-Eval_5.20151.42 ...

  2. QListWidget

    1.失去焦点背景颜色,代码设置全选的时候,背景会是白色,需要设置失去焦点背景颜色.(设置焦点,会出现白转化成设置背景色,效果不好) QPalette p; p.setColor(QPalette::I ...

  3. VIM常用操作总结

    VIM常用的模式网上说法不太一样,但是大同小异,这里大致分一下,便于后面总结 1.一般模式 默认打开文件后的模式,这个时候只能移动光标,不能编辑 2.输入模式 一般模式按下i,就可以进入输入模式,输入 ...

  4. 服务器×××上的MSDTC不可用解决办法

    MSDTC(分布式交易协调器),协调跨多个数据库.消息队列.文件系统等资源管理器的事务.该服务的进程名为Msdtc.exe,该进程调用系统Microsoft Personal Web Server和M ...

  5. 常用iOS第三方库以及XCode插件介绍

    第三方库 CocoaPod CocoaPod并不是iOS上的第三方库 而是大名鼎鼎的第三方库的管理工具 在CocoaPod没有出现之前 第三方库的管理是非常痛苦的 尤其是一些大型的库(比如nimbus ...

  6. Spring+SpringMVC+Mybatis 多数据源整合(转)

    转载自:http://blog.csdn.net/q908555281/article/details/50316137 目录(?)[-]拷贝所需jar拷贝jar文件需要的jar文件入下图所示因为我的 ...

  7. osg::NodeVisitor中计算一个节点对应的世界变换矩阵、法向量、顶点坐标

    class MyNodeVisitor:public osg::NodeVisitor { pulic: MyNodeVisitor():osg::NodeVisitor(osg::NodeVisit ...

  8. openssl/asn1.h file not found的解决方法

    iOS 引入支付宝 缺少 #include <openssl/asn1.h>  报错     解决方法: 在 Building Settings -> Search Paths -& ...

  9. 让chrome的控制台更高大上(装B用)

    作为一名屌丝前端程序员,在装B的道路上是越走越远了!废话不多说,直接先上几张图:我的Element是这样的: 我的console是这个样子的: 我的Timeline是这个样子的: ---------- ...

  10. iphone删除自动更新的系统

    1.利用 etc/host 文件屏蔽 Apple 更新服务器用电脑 iTools 或者手机 iFile 打开 etc/host 文件,添加:127.0.0.1 mesu.apple.com到文件中.2 ...