2010-10-07 69 views
20
std::vector<string> names; 
std::vector<string>::iterator start = names.begin(); 
std::vector<string>::iterator end = names.end(); 
sort (start,end); 
//are my start and end valid at this point? 
//or they do not point to front and tail resp? 
+0

我認爲應該是'std :: vector :: iterator start'? – 2010-10-07 20:18:27

+1

即使這是真的,開發者在你將浪費一天的時間試圖證明這是他修復某個bug的根本原因... – 2010-10-07 20:21:23

+0

@Ben,謝謝,對不起復制粘貼邪惡! – 2010-10-07 20:36:40

回答

18

根據C++標準§ 23.1/11:

除非另有規定(顯式或通過在其它功能來定義的函數),調用 的容器部件的功能或使容器作爲的參數,庫函數不應使 迭代器無效,或者更改該容器內的對象的值或更改其值。

§ 25.3「排序和相關操作」沒有指定迭代器將會失效,因此問題中的迭代器應該保持有效。

11

他們仍指向開始和結束。矢量的這些槽中的值可能已更改,但每個駐留的存儲位置保持不變。

1

std::vector保持其連續內存中的元素。 std::sort通過值獲取參數(迭代器)並重新排列它們之間的序列。最終的結果是你的局部變量startend仍然指向矢量的第一個和最後一個元素。

6

std::sort不會使迭代器無效到一個向量。排序模板使用迭代器上的*運算符來訪問和修改矢量的內容,並且通過迭代器修改矢量元素到已經在矢量中的元素不會使任何迭代器失效。

綜上所述,

  • 您現有的迭代器不會被
  • 但是無效,他們指出,可能已被修改

除了通過提供的標準的支持元素Kirill V. Lyadvinsky(Does a vector sort invalidate iterators?):

  • 25/5「Algorit HMS庫」

如果算法的效果部分說 一個值指向任何 迭代器作爲參數傳遞的 修改,那麼該算法具有 額外類型的要求:那類型 參數應滿足可變迭代器 (24.1)的 要求。

  • 24。1/4「迭代器的要求」

除了它的類別,前向,雙向 ,或隨機存取 迭代器也可以是可變的或恆定 取決於表達的 結果是否* I表現爲 參考或作爲參考 常數。