标签:
1.vector是动态空间,支持高效的随机访问和高效向尾部插入新元素的容器。
随着元素的插入,它的内部机制会自行扩充空间以容纳新元素。那么vector会以怎样的方式扩充空间呢?
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vec; cout<<"Size"<<"\t"<<"sizeof"<<"\t"<<"Capacity"<<endl; cout<<vec.size()<<"\t"<<sizeof(vec)<<"\t"<<vec.capacity()<<endl; for (int i=0;i<20;++i) { vec.push_back(1); cout<<vec.size()<<"\t"<<sizeof(vec)<<"\t"<<vec.capacity()<<endl; } }
程序的运行结果如下:
从结果可以看出,当vector的元素个数为0时,分配的内存为0;当插入1个元素后,分配1个单位的空间(此时,分配的内存已被全部占用);再插入一个元素,内存空间翻倍,变为2个单位(此时,分配的内存也被全部占用);再插入元素时,现将内存翻倍,变为4个单位,而实际占用的只有3个.......以此类推,当分配的空间被全部占用时,就再次将内存翻倍。总结,vector的内存是翻倍的方式扩充的。
2、vector的数据结构
vector采用的数据结构:线性连续空间,
class vector {
...
protected:
iterator start; //表示目前使用空间的头
iterator finish; //表示目前使用空间的尾
iterator end_of_storage; //表示目前可用空间的尾
...
};
iterator其实就是指针,一个指针占用4个字节,这也就是上面程序的sizeof(vec)结果为12的原因。
3、vector的常用操作
(1)begin() //返回第一个元素的迭代器;
(2)end() //返回最后一个元素的下一位置的迭代器;
例如,下面是只有2个元素的vector的结果:
(3)capacity() //返回vector的容量(包括已使用的空间和未使用的空间)
(4)empty() //返回vector是否为空,若容器为空,则返回true,否则返回false
(5)front() //返回第一个元素的引用
(6)back() //返回最后一个元素的引用
(7)push_back() //在vector末尾插入新的元素
(8)pop_back() //删除最后一个元素
(9)erase() //删除某位置上的元素,返回被删除位置的下一个位置
例如:
int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); Show(vec); vector<int>::iterator itr=vec.end(); itr--; cout<<*(vec.erase(itr))<<endl; }
结果:
另外,在对vector进行插入、删除时会造成迭代器的失效问题(被查删除位置的迭代器已经不能进行任何的运算),因此,删除vector中的某个元素的正确程序:
int main() { vector<int> vec; vec.push_back(1); vec.push_back(2); vec.push_back(3); vec.push_back(2); Show(vec); vector<int>::iterator itr=vec.begin(); //删除元素2 while(itr!=vec.end()) { if(*itr==2) itr=vec.erase(itr); else itr++; } Show(vec); }
结果如下:
标签:
原文地址:http://www.cnblogs.com/acode/p/4619259.html