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?
20
A
回答
18
根據C++標準§ 23.1/11:
除非另有規定(顯式或通過在其它功能來定義的函數),調用 的容器部件的功能或使容器作爲的參數,庫函數不應使 迭代器無效,或者更改該容器內的對象的值或更改其值。
§ 25.3「排序和相關操作」沒有指定迭代器將會失效,因此問題中的迭代器應該保持有效。
11
他們仍指向開始和結束。矢量的這些槽中的值可能已更改,但每個駐留的存儲位置保持不變。
1
std::vector
保持其連續內存中的元素。 std::sort
通過值獲取參數(迭代器)並重新排列它們之間的序列。最終的結果是你的局部變量start
和end
仍然指向矢量的第一個和最後一個元素。
6
std::sort
不會使迭代器無效到一個向量。排序模板使用迭代器上的*
運算符來訪問和修改矢量的內容,並且通過迭代器修改矢量元素到已經在矢量中的元素不會使任何迭代器失效。
綜上所述,
- 您現有的迭代器不會被
- 但是無效,他們指出,可能已被修改
除了通過提供的標準的支持元素Kirill V. Lyadvinsky(Does a vector sort invalidate iterators?):
- 25/5「Algorit HMS庫」
如果算法的效果部分說 一個值指向任何 迭代器作爲參數傳遞的 修改,那麼該算法具有 額外類型的要求:那類型 參數應滿足可變迭代器 (24.1)的 要求。
- 24。1/4「迭代器的要求」
除了它的類別,前向,雙向 ,或隨機存取 迭代器也可以是可變的或恆定 取決於表達的 結果是否* I表現爲 參考或作爲參考 常數。
相關問題
- 1. 迭代器是否失效?
- 2. 的std ::矢量斷言失敗(矢量迭代器不兼容)
- 3. 增加可變輸入迭代器是否使舊迭代器值失效?
- 4. 二維矢量迭代器
- 5. 矢量迭代器不dereferencable
- 6. C++排序陣列=>矢量迭代器不相容
- 7. 客戶端堆排序矢量,錯誤地傳遞迭代器?
- 8. std ::向量迭代器失效
- 9. hash_map.erase是否使所有迭代器失效?
- 10. EXC_BAD_ACCESS何時使用矢量迭代器?
- 11. 使用帶矢量的STL迭代器
- 12. 如果迭代器在STL容器中失效,指針是否失效
- 13. 失敗安全與失敗快速迭代器(矢量)
- 14. 在向量迭代過程中避免迭代器失效
- 15. 矢量end迭代
- 16. 當ptr_vector迭代器失效
- 17. C++矢量迭代器不增量
- 18. std :: move()使迭代器失效嗎?
- 19. 矢量分配是否使`reserve`無效?
- 20. C++:列表迭代器與矢量迭代器
- 21. 程序在使用矢量迭代器時中止
- 22. 是否有可能使用迭代器將矢量分成10組?
- 23. 排序矢量
- 24. 排序矢量
- 25. C++中的矢量迭代器
- 26. C++中的矢量迭代器
- 27. VC++矢量迭代器初始化
- 28. C++矢量迭代器錯誤
- 29. 矢量迭代器不能解碼....?
- 30. 用迭代器插入到矢量中
我認爲應該是'std :: vector :: iterator start'? –
2010-10-07 20:18:27
即使這是真的,開發者在你將浪費一天的時間試圖證明這是他修復某個bug的根本原因... – 2010-10-07 20:21:23
@Ben,謝謝,對不起復制粘貼邪惡! – 2010-10-07 20:36:40