簡體   English   中英

推進std :: vector std :: advance VS運算符+的迭代器?

[英]Advance iterator for the std::vector std::advance VS operator +?

我發現自己寫了很多東西:

int location =2;
vector<int> vec;
vector<int>::iterator it=vec.begin();

/..../
std::advance(it, location);

代替

 it= it + 5;

什么是首選/推薦方式?

添加僅適用於隨機訪問迭代器。 std::advance將適用於各種迭代器。 只要你只將迭代器處理成向量,它就沒有什么區別,但是std::advance使你的代碼更通用(例如,你可以用一個list替換vector ,那部分仍然可以工作)。

對於那些關心的人,標准描述了advancedistance如下(§24.3.4/ 1):

由於只有隨機訪問迭代器提供+和 - 運算符,因此庫提供了兩個函數模板advancedistance 這些函數模板使用+-用於隨機訪問迭代器(因此,它們是恆定的時間); 對於輸入,轉發和雙向迭代器,它們使用++來提供線性時間實現。

另請注意,從C ++ 11開始,標准向std::next添加了一個參數,因此您可以使用它前進指定的數量(和std::prev類似)。 std::advance的不同之處在於它返回修改后的迭代器( std::advance不會),這在某些情況下很方便。

這取決於你需要什么:

如果您需要通用性 ,請使用std::advance(it,2) 如果有人出現並將std::vector更改為std::list ,則代碼仍將編譯,即使現在提前需要線性時間而不是常量時間。

如果您需要性能 ,請使用it+=2 如果有人出現並將std::vector更改為std::list ,則代碼將無法編譯,指向(可能帶有幫助的注釋)嚴重的性能問題。

這取決於迭代器。 it=it+5如果支持它會更快(它只支持隨機訪問迭代器)。 如果你想推進功能較弱的迭代器(例如前向迭代器或雙向迭代器),那么你可以使用std::advance ,但它更慢,因為它實際上遍歷所有中間元素。

std::advance適用於非隨機迭代器,而+=版本適用於隨機訪問序列(向量等)。

std::adnvance是通用的 - 如果你不總是知道底層容器的類型,它會很有用 - 它適用於所有情況。

然而它是有效的:如果它傳遞一個RandomAccessIterator(如std::vector ), std::advance將進行優化,並且會在ForwardAccessIterator的循環中增加迭代器(就像在std::list )。

使用std :: advance。 它同樣有效(它使用迭代器特性來為隨機訪問迭代器添加迭代器),並且更通用的是它也適用於其他類型的迭代器。

如果您永遠不會更改容器(並且您可能不是),請使用+,因為它易於查看和理解,並使代碼更簡潔。

如果您認為要更改容器,或者如果您在可能在各種容器類型上實例化的模板內部工作,請使用advance,因為它適用於任何容器。

作為一般規則,我不擔心更改容器類型,因為我發現當我必須更改容器類型時,我最終會重新訪問容器被使用的任何地方,只是為了確保我不做任何突然愚蠢的東西(比如從列表中間隨機抽取元素)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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