vector<int> v;
v.push_back(0);
v.push_back(1);
v.push_back(2);
vector<int>::iterator v_it = v.begin();
for (; v_it != v.end(); ++v_it)
{
if(*v_it==1)
v.push_back(3);
}
for (v_it = v.begin(); v_it != v.end(); ++v_it)
{
cout << *v_it << endl;
}
编译运行的时候会出现这个断言失败:
是不是对所有容器,在插入元素在之后,如果重新分配了内存,原来的迭代器就会失效?
如果在前面加上一行代码
vector<int> v;
v.reserve(10);
v.push_back(0);
v.push_back(1);
v.push_back(2);
vector<int>::iterator v_it = v.begin();
for (; v_it != v.end(); ++v_it)
{
if(*v_it==1)
v.push_back(3);
}
for (v_it = v.begin(); v_it != v.end(); ++v_it)
{
cout << *v_it << endl;
}
那么编译就不会出现失败。
但是,在Linux(Ubuntu)下,GCC 4.5.5 ,第一段的代码编译运行没有任何问题,也许是不同编译器下对迭代器段实现不同吧。
1.size()告诉你容器中目前有多少个元素,而resize则会在容器的尾部添加或者删除一些元素,来调整元素容器的实际容量,使之与指定大小一致。这两个函数对list,vector和deque使用,但对其它容器不适用。
2.capacity则告诉你最少添加多少个元素才会导致荣日重新分配内存,而reserve在必要的时候总是会使容器的内部缓冲区扩充至一个更大的容量,以确保至少能满足你指出的空间大小,这两个函数仅对vector适用。