vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
1 2 3 4 5 6 7 8 9 10
| vector<int> test; test.pushback(1); vector<int>::iterator iter=test.begin(); while(iter!=test.end()) {cout<<*iter;iter++} c.erase(pos) c.erase(beg,end) c.insert(pos,elem) c.size() c1.swap(c2);swap(c1,c2)
|
内存机制
1 2 3 4 5 6 7 8
| vector<int> arr; ofstream wf("1.txt"); for(int i=0;i<100;++i) { arr.push_back(i); wf<<"capacity="<<arr.capacity()<<",size="<<arr.size()<<end; } wf.close();
|
capacity()返回的是当前vector对象缓冲区(后面的对vector维护的内存空间皆称为缓冲区)实际申请的空间大小,而size()返回的是当前对象缓冲区中存储数据的个数,capacity永远是大于等于size的,当size和capacity相等时继续添加数据时vector会扩容。
基本上是扩容已有空间的50%。
从文件中可以观察capacity的变化,我们可以更直观的去扩容的源码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| if (max_size() - size() < _Count)_Xlen(); else if (_Capacity < size() + _Count){ _Capacity = max_size() - _Capacity / 2 < _Capacity? 0 : _Capacity + _Capacity / 2; if (_Capacity < size() + _Count) _Capacity = size() + _Count; pointer _Newvec = this->_Alval.allocate(_Capacity); pointer _Ptr = _Newvec; ... ... ... }
|
对的,就是每次扩容50%。至于删除容器中数据的时候,缓冲区大小并不会改变,仅仅只是清楚了其中的数据,只有在析构函数调用的时候vector才会自动释放缓冲区。
vector.resize() 与 vector.reserve()的区别
reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/insert()函数。
resize是改变容器的大小,并且创建对象,因此,调用这个函数之后,就可以引用容器内的对象了,因此当加入新的元素时,用operator[]操作符,或者用迭代器来引用元素对象。
引用http://blog.csdn.net/mfcing/article/details/8746256