簡體   English   中英

矢量迭代器<或!=

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM