vector<int> nums;
nums.push_back(0);
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
vector<int>::iterator it = nums.begin();
it++;
cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
cout << (*jt) << endl;
}
cout << endl;
nums.insert(it, 100500);
cout << ">> insert(it, 100500)" << endl << endl;
cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
cout << (*jt) << endl;
}
cout << endl;
it++;
cout << ">> it++" << endl << endl;
cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
cout << (*jt) << endl;
}
cout << endl;
nums.insert(it, 100800);
cout << ">> insert(it, 100800)" << endl << endl;
cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
cout << (*jt) << endl;
}
cout << endl;
it++;
cout << ">> it++" << endl << endl;
cout << "it points to " << *(it) << endl;
for(vector<int>::iterator jt = nums.begin(); jt != nums.end(); jt++) {
cout << (*jt) << endl;
}
cout << endl;
返回
it points to 1
0
1
2
3
>> insert(it, 100500)
it points to 1
0
100500
1
2
3
>> it++
it points to 2
0
100500
1
2
3
>> insert(it, 100800)
it points to 100800
134352185
0
100500
1
2
3
>> it++
it points to 2
134352185
0
100500
1
2
3
我什么都不懂。帮助!
mingw g ++ 4.5.0 win32
答案 0 :(得分:6)
将新元素插入vector
时,插入位置后元素的任何迭代器都将失效,如果重新分配,则所有进入容器的迭代器都将失效。只要v.capacity() - v.size()
小于您尝试插入的元素数,就会发生重新分配。
当迭代器失效时,意味着不能再使用迭代器。它无效。
insert
的这个重载会向inserted元素返回一个新的迭代器,所以你可以替换它:
nums.insert(it, 100500);
用这个:
it = nums.insert(it, 100500);
对于每个容器,迭代器失效的规则是不同的,您必须小心理解它们。 STL的最佳参考之一是SGI STL documentation。迭代器失效规则通常列在每个容器文档页面的脚注中。
请注意,SGI STL文档不是C ++标准库的官方文档,并且存在一些细微差别,但通常这些差异并不是特别重要;需要注意的一点是,SGI STL的某些部分未包含在C ++标准库中,而且C ++标准库的某些部分不属于SGI STL。
答案 1 :(得分:0)
这不是错误。在得出软件错误的结论之前,您未能正确阅读std::vector
文档;实际上,向量插入使所有迭代器无效。