我在C++编程语言阅读:特别版不使用迭代器已调整大小的矢量
Don't use iterators into a resized vector
考虑这个例子。
vector<int>::iterator it = foo.begin();
while (it != foo.end()) {
if (// something) {
foo.push_back(// some num);
}
++it;
}
这有问题吗?在矢量调整大小之后,循环条件中的foo.end()会向前推1吗?
P.S.另外,如果向量为x个整数预留了空间,该怎么办?如果push_back没有违反这个空间,它会不会是一个问题(我会假设如果it.end()指向一个超过vector中包含某个元素的最后一个元素)。
如果矢量的大小适合10个整数,该怎么办?假设push_back没有超过这个预分配的大小,它是否仍然使迭代器无效? – Anonymous 2010-01-22 20:42:22
@Person:严格地说,如果'push_back'不会导致向量的size()超出之前在调用reserve时给出的请求容量,那么你可以保证对'push_back'的调用不会导致重新分配并且不会使迭代器失效到对象。不过,你仍然需要调用'end()'来获得正确的'end()'。 – 2010-01-22 20:45:09
谢谢。我认为最好不要用预留空间和迭代器跳舞,而应该在这种情况下使用数组索引。 – Anonymous 2010-01-22 20:47:52