我试图将额外的字符串推送到向量的中间时得到terminate called after throwing an instance of 'std::bad_alloc'
。我使用了g ++ 4.8.2。
在coliru上使用g ++ 5.2时,我甚至得到了错误的矢量大小size of str_vector 0: 1, size of str_vector 1: 1
的输出。
当我使用索引(例如str_vector[0]
)访问向量或使用std::list
时,程序正常工作。
这是否意味着对iterator
的使用有一些限制?我假设当我使用索引或迭代器访问向量时应该没有任何区别。
#include <iostream>
#include <string>
#include <vector>
using std::vector;
using std::string;
int main() {
vector<vector<string>> str_vector;
str_vector.emplace_back();
vector<vector<string>>::iterator it0 = std::prev(str_vector.end());
it0->push_back("a");
str_vector.emplace_back();
vector<vector<string>>::iterator it1 = std::prev(str_vector.end());
it1->push_back("a");
it0->push_back("a"); // bad alloc here
std::cerr << "size of str_vector 0: " << it0->size() << std::endl;
std::cerr << "size of str_vector 1: " << it1->size() << std::endl;
return 0;
}
答案 0 :(得分:3)
向向量添加元素时,可能需要重新分配其内部内存,这会导致所有迭代器变为无效。因此,在执行第二个emplace_back
之后,第一个迭代器it0
将变为无效。
答案 1 :(得分:1)
迭代器只不过是面向对象的指针。迭代器失效很像指针失效。
C ++规范:
vector:插入点之前的所有迭代器和引用 不受影响,除非新容器的大小大于之前的容器 容量(在这种情况下,所有迭代器和引用都无效) [23.2.4.3/1]
第一次执行下面的行时,它是有效的。第二次使用相同的迭代器,迭代器已经失效:
it0->push_back("a"); // bad alloc here
要知道迭代器失效是什么以及如何处理它,这里有关于迭代器失效的优秀帖子: