简介:
vector可用于替代C中的数组,或者MFC中的CArray,从许多说明文档或者网上评论,一般一致认为应该优先选择vector,因为它的效率更高,而且具备很好的异常安全性。
而且vector是STL推荐使用的默认容器,除非有特殊需要,如需要容器在head和tail高效的插入和删除,或者在任何位置高效的插入和删除,那么此时使用vector不能满足需求,可能使用deque或者list更加合适。
内存申请:
vector是连续内存容器,也就是说,标准要求所有标准库实现的时候,vector中的元素的内存必须是连续的。所以,对于插入和删除的时间复杂度是很高的,因为插入或删除的时候需要元素的移动,即元素复制拷贝。
vector的初始化:
1. 基本初始化
//Format 1: vector<T> v(n,i) //v包含n个值为i的元素
vector<int> ivec(10, 2);
//Format 2: vector<T> v(v1) //v1是v的一个副本
vector<int> ivec1(ivec);
//Format 3: vector<T> v(n) //v包含n个值初始化的元素
vector<int> ivec2(10); //10个元素,每个都初始化为0
vector<string> svec(10); //10个元素,每个都初始化为空string
//Format 4: 用back_inserter函数
vector<int> ivec4; //空对象
fill_n(back_inserter(ivec4), 10, 3); //10个3,填充ivec4
2. 填充vector
vector的赋值并不可以像数组一样方便的用花括号方便的完成赋值, 這里借用了数组来初始化这个vector,用原始数组的内容填充vector。
例如我们有数组
int v1[10] = {0,1,0,0,3,0,0,4,4,4};
初始化方式1(这种方式最为习惯):
//Format : vector<T> intvec(begin, end);
vector<int> ivector(v1, v1+10);
初始化方式2:
vector<int> v2(10);//初始化size为10可以避免数组动态增长的时候不断分配内存
//v2.reserve(10); //同上,只要使用其中一个就可以了
for (int i=0; i<10; i++)
{
v2.push_back(v1[i]);//增加一个元素
}
初始化方式3:
vector<int> v3(&v1[0], &v1[9]);//原始数组的元素指针可以作为迭代器来使用
初始化方式4:
vector<int> v4;
v4.reserve(10);
v4.insert(v4.begin(), &v1[0], &v1[9]);
初始化方式5:
vector<int> v5(10);
copy(v5.begin(), &v1[0], &v1[9]);
Note:
原始数组的元素指针可以作为迭代器来使用。
原则:尽量使用reserve来减少不必要的内存分配次数。
原则:尽量使用empty而不是size()==0来判断容器是否为空。
reference :
1. http://www.cnblogs.com/freeopen/p/5482962.html
2. https://www.cplusplus.me/1112.html
600





