2014-03-06 41 views
2

對於STL中的載體v,是否安全地存儲v.end()(例如vector :: iterator)供以後使用?我會保證,當我稍後使用存儲的迭代器時,它仍然會指向相同的位置?我們可以安全地依賴迭代器的v.end()的位置嗎?

考慮以下向量v
1, 2, 3, 4, 5

我現在儲存起來std::vector<int>::iterator it = v.end()。後來,我推入了2個新元素,之後它看起來像:
1, 2, 3, 4, 5, 6, 7

我現在可以放心嗎*it == 6

+0

我在答案中犯了一個小錯誤,但我糾正了它。查看編輯的答案。 –

回答

6

後您東西放到一個std::vectorend() iterator是總是無效。

所有其他迭代器是有效除非

新容器的大小比之前的容量


但也有容器,其迭代器後沒有得到失效更大推動。請參閱this question的優秀答案。


如果你想記住一個矢量內的位置使用迭代器新的元素,你可以確保新的大小不大於使用reserve()成員舊容量大。

std::vector<int> numbers = {1,2,3}; 
numbers.reserve(4); 
int capacity = numbers.capacity(); // capacity >= 4 
std::vector<int>::iterator pos = numbers.begin() + 2 // any iterator before 
                // the point of insertion 
numbers.push_back(4); // new size is 4, old capacity is >= 4, 
         // therefore pos is still valid. 
+0

謝謝,那麼只有在向量中記住位置的唯一方法是使用數組索引來記住位置,如果我要將額外的元素推入向量中? – lwxted

+1

@lwxted沒錯。或者使用'std :: list',在推入額外的元素之後迭代器不會失效。 –

+0

非常感謝。也感謝張貼鏈接! – lwxted

1

§23.3.6.5/1 [vector.modifiers]

導致重新分配,如果新的尺寸比舊款更大的容量。如果沒有重新分配, 插入點之前的所有迭代器和引用保持有效。

它沒有明確說明,但這意味着所有迭代器,插入點處和之後的引用都將失效。這包括end迭代器。本節特別介紹insert/push_back,但在擦除等方面仍然或多或少是準確的。

§23.3.6.3/5 [vector.capacity]

重新分配無效的所有引用,指針和迭代器指的是序列中的元素 。保證在 對reserve()的調用之後發生的插入期間不發生重新分配,直到插入將使vector的大小大於 爲capacity()的值。

+0

所以只有重新分配可以使向量迭代器(在push_back之後)失效? –

+0

所有矢量修飾符(插入/擦除/ push_back /保留/調整/等)可以使向量迭代器無效。編輯到帖子中 –

相關問題