[英]Vector iterators < or !=
任何人都可以幫助我理解!=
和<
在討論for
循環中的向量迭代器時是否存在很大差異?
我的意思是,無論你使用!=
和<
,結果應該是一樣的嗎?
for (vector<int>::iterator i = vec.begin(); i != vec.end(); i++)
// DO STUFF
for (vector<int>::iterator i = vec.begin(); i < vec.end(); i++)
// DO STUFF
據我所知,最常見的方法是使用!=
,但將<
是一個很大的問題,如果使用?
operator<
僅支持隨機訪問迭代器 。 std::vector::iterator
是一個隨機訪問迭代器,因此i != vec.end()
和i < vec.end()
都支持且有效,並且在您的示例中沒有任何區別。
如果你有一個不支持隨機訪問迭代器的容器(例如std::list
),那么i < list.end()
將無法編譯。
一般的建議是僅在必要時使用postfix增量,因為當迭代器不重要時它可能會創建一個不必要的副本,所以++i
更清晰,可能更快。
此外,如果循環調用其定義在此轉換單元中不可用的函數,則vec.end()
將在每次循環迭代時從內存重新加載,這可能導致不必要的高速緩存未命中。 您可以通過將值保存到局部變量來避免重新加載,以便編譯器確定本地變量對於任何其他函數是不可訪問的:
for(vector<int>::iterator i = vec.begin(), j = vec.end(); i < j; ++i)
// ...
更好的是,您可能希望使用range-for循環來避免這些性能陷阱:
for(auto const& elem : vec)
// ...
標准庫(容器,迭代器和算法)的STL
部分背后的整個理念是最小化容器之間的程序區別。 它們具有不同的屬性,但是如何對它們進行編程的設計盡可能相似。
這使得它們更容易學習並且更容易一般地使用。 這意味着您可以編寫一個通用函數(或算法)並將其應用於任何其他容器(或盡可能多的容器)。
考慮到這一點是有益的使用語法,通用於所有的容器和迭代器在可能的情況 。
只有一些容器的迭代器允許<
比較,但所有容器的迭代器都接受!=
。 出於這個原因,我建議始終使用!=
作為一致性,並方便您的代碼輕松移植到不同的容器。
雖然不是std::vector
,但它確實有所作為。 所有迭代器都是可比較的,所以!=
將始終有效。 只有隨機訪問迭代器比std::vector
更不可比,所以在你的情況下它不會是一個大問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.