2015-09-07 42 views
0

我在v.begin()+ 3或v.end()等出現錯誤。爲什麼我們無法對迭代器進行操作?如何通過指定的值增加任何容器的迭代器?

有兩個列表l和m

l.assign(m.begin()+ 3,m.end() - 1);

這段代碼有錯誤

[錯誤]沒有匹配關於 '操作符 - '(操作數的類型是 '的std ::列表:迭代{又名的std :: _ List_iterator}' 和 'INT')

+1

並非所有(種)迭代器都可以這樣遞增。 –

+0

您可能希望查看[這個方便的迭代器引用](http://en.cppreference.com/w/cpp/iterator)並閱讀有關不同的迭代器類型。請注意,['std :: list'](http://en.cppreference.com/w/cpp/container/list)的迭代器是[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator),它不允許你想要的操作,至少不是直接。 –

回答

0

使迭代器儘可能抽象;一個迭代器可以是一個指向數組的指針,當你增加它時,它可以從stdin中讀取流中的位置,任何東西。因此,標準算術運算符只能用於隨機訪問迭代器,因此它們不會隱藏簡單語法後面的潛在昂貴操作。

爲了增加/減少以任意量的任何迭代器,則可以使用std::advance

std::advance(it, 3); //increment by three 
std::advance(it, -1); //decrement once 

C++ 11提供std::nextstd::prev其以更多功能性的方式進行了這一點:

auto new_it = std::next(it,3); //increment by three 
auto new_it = std::prev(it); //decrement once 
+0

是std :: advance是否適用於所有類型的迭代器? –

+0

它適用於任何輸入迭代器類型。 – TartanLlama

相關問題