vector类模板看起来像一个快速的数组,它就有数组的索引方式,而且可以动态的扩展。
为了达到高效的索引和迭代,vector将其内容作为一个连续的对象数组来维护。这样就导致除了向vector最后插入新元素外,向vector中插入一个对象是不可以接受的操作。
当vector预分配的存储空间用完后,为维护连续的对象数组,它必须在另一个地方分配新的更大的存储空间,并把已有的对象拷贝到新的空间中,然后释放之前的空间,这个效率是很低的。
当使用一个简单的指针作为迭代器时,当超出预分配空间需要重新分配空间时就会出现问题----“迭代器无效”。
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> vi(10, 0);
ostream_iterator<int> out(cout, " ");
vector<int>::iterator i = vi.begin();
*i = 47;
copy(vi.begin(), vi.end(), out);
cout << endl;
vi.resize(vi.capacity() + 1);
*i = 48; // Now i points to wrong memory
copy(vi.begin(), vi.end(), out);
cout<<endl;
getchar();
return 0;
}
使用Vector最安全的办法,就是一次性地填入所有元素,然后在程序的其他地方仅仅是使用它。
使用vector最有效的条件是:
(1)在开始时用reserve()分配正确的存储区,因此vector不会再重新分配存储区;
(2)仅仅在序列的后端添加或删除元素。