[英]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
,那部分仍然可以工作)。
對於那些關心的人,標准描述了advance
和distance
如下(§24.3.4/ 1):
由於只有隨機訪問迭代器提供+和 - 運算符,因此庫提供了兩個函數模板
advance
和distance
。 這些函數模板使用+
和-
用於隨機訪問迭代器(因此,它們是恆定的時間); 對於輸入,轉發和雙向迭代器,它們使用++
來提供線性時間實現。
另請注意,從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.