vector用法

一:初始化问题:

1. 定义一个已知长度的 vector :

vector<int>ivec(10);//初始化为size=10,capacity为10,元素值全部为0(默认)
int cap=ivec.capacity();
int size=ivec.size();
ivec.push_back(1);//成为第11个

vector的元素被初始化为与其类型相关的缺省值:算术和指针类型的缺省值是 0,对于class 类型,缺省值可通过调用这类的缺省构造函数获得,我们还可以为每个元素提供一个显式的初始值来完成初始化

2.显示初始化vector:

vector< int > ivec( 10, -1 ); //定义了10个元素,每个元素初始化为-1;

3.利用迭代器初始化:

int ia[ 6 ] = { -2, -1, 0, 1, 2, 1024 };

我们不能用同样的方法显式地初始化 vector ,但是可以将 vector 初始化为一个已有数组的全部或一部分,只需指定希望被用来初始化 vector 的数组的开始地址以及数组最末元的下一位置来实现,例如:   
// 把 ia 的 6 个元素拷贝到 ivec 中  
vector< int > ivec( ia, ia+6 );  

 

总结:其实都是利用vector的构造函数进行初始化

 

 二:vector的resize()和reserve()问题:resize对应的是finish指针,而reserve对应的是end_storage指针

当使用vector中的reserve时会重新分配内存空间,使capacity变大,reserve参数大于等于原来的size,如果小于原来的size的话就不用重新分配。

而当使用resize,只要new size不大于capacity,则不会重新分配内存空间,如上图可以看到动态数组的地址是没有发生变化的。

resize之后数组的长度变成了new size,如果new size比原来size大的话,新元素为未知值,没有初始化,如果new size比原来的小的话就截断,但内存空间也没有重新分配

当resize的参数大于capacity,则会重新分配内存空间。

三:at()和operator[]

1、   vector::at()

2、   vector::operator[]                    //不进行边界检查

operator[]主要是为了与C语言进行兼容。它可以像C语言数组一样操作。但at()是我们的首选,因为at()进行了边界检查,如果访问超过了vector的范围,将抛出一个例外。

 

四:尽量使用c.empty()代替c.size(),因为后者需要遍历整个vector得到个数,效率低

 

五:vector的拷贝构造函数的,只拷贝到finish指针的元素。

vector<int> nums;
 nums.push_back(1);

 nums.push_back(1);

 nums.push_back(2);

 nums.push_back(2);
 vector<int>().swap(nums); 

    vector<int>().swap(nums); 或者如下所示 加一对大括号都可以,意思一样的:  
    { 
     std::vector<int> tmp (nums);//拷贝构造函数是只拷贝到finish位置   
     nums.swap(tmp); 
    }      

posted @ 2015-05-19 16:19  kkshaq  阅读(359)  评论(0编辑  收藏  举报