vector

vector是C++标准模板库中的部分内容,中文偶尔译作“容器”,但并不准确。它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

1
2
3
4
5
6
7
8
9
10
//简单的使用方法
vector<int> test;//建立一个vector
test.pushback(1);//把1vector,这样test[0]就是1
vector<int>::iterator iter=test.begin();//定义一个可以迭代int型vector的迭代器iter,它指向test的首位
while(iter!=test.end()) {cout<<*iter;iter++}//iter++指的是向前迭代一位,直到iter到超出末端迭代器为止,输出迭代器指向的值
c.erase(pos)//删除pos位置的数据,传回下一个数据的位置。
c.erase(beg,end)//删除[beg,end)区间的数据,传回下一个数据的位置。
c.insert(pos,elem)//在pos位置插入一个elem拷贝
c.size()//返回容器中实际数据的个数。
c1.swap(c2);swap(c1,c2)//将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(); // result too long,抛出异常_THROW(length_error, "vector<T> too long");
else if (_Capacity < size() + _Count){ // not enough room, reallocate
_Capacity = max_size() - _Capacity / 2 < _Capacity? 0 : _Capacity + _Capacity / 2; // try to grow by 50%,扩容50%
if (_Capacity < size() + _Count)//扩容50%后依然不够容下,则使容量等于当前数据个数加上新增数据个数
_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

STL