标签:
一:初始化问题:
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);
}
标签:
原文地址:http://www.cnblogs.com/kkshaq/p/4514848.html