我在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