迭代器是容器五大組件中十分重要的一種,爲咱們提供了一種與容器種類、元素類型無關的訪問容器的方法。html
按照是否提供修改容器元素內容、遍歷方法等、迭代器可分爲五大類,以下圖所示:ios
有關五種迭代器的具體使用,可參考CPPreference等權威資料。c++
首先貼一篇博客:http://m.blog.csdn.net/zhongjiekangping/article/details/5624922 這篇博客很好地解答了個人部分疑惑。函數
如今考慮一個最簡單的需求,如何刪除vector的指定元素?如何在vector每一個元素後追加一個元素?(實際上,對vector插入元素有可能很影響效率,若是頻繁插入元素,能夠考慮list等)學習
std::vector< int> Vec; std::vector< int>::iterator itVec; for( itVec = Vec.begin(); itVec != Vec.end(); ) { if( WillDelete( *itVec) ) { itVec = Vec.erase( itVec); } else itList++; }
對vector、queue等,每次erase操做,函數會刪除指定迭代器位置的元素,而後將後面的元素前移一位,erase返回指向被刪除元素下一元素的迭代器。(其實,我認爲,返回的仍是指定的迭代器,只不過它如今指向了被刪除元素的下一元素,若有不對,懇請你們指正!)spa
對於erase操做,還有一種寫法是:.net
Vec.erase(itVec++)
不過須要注意,這種寫法對vector、deque等容器無效!
code
上面兩種寫法,第一種對各類容器都有效,第二種寫法只對map,list等容器有效。爲了方便統一,仍是建議採起第一種寫法。htm
出於學習的目的,如今提出一個要求,如原有vector爲{1,2,3,4,5},如今要在每一個元素前加一個8,使vector變爲{8,1,8,2,8,3,8,4,8,5}.用循環表示,代碼以下:對象
#include<iostream> #include <vector> using namespace std; int main() { vector<int> vec{ 1,2,3,4,5}; auto iter = vec.begin(); for (; iter != vec.end();) { iter = vec.insert(iter,8); iter++; iter++; } for (auto num : vec) cout << num << endl; return 0; }
須要注意的是,insert會將指定對象插入指定迭代器以前的位置,並返回這個位置的迭代器,要想該迭代器指向以前的下一個元素,須要遞增兩次。
若是須要在每一個元素以後插入元素,該怎麼操做?
#include<iostream> #include <vector> using namespace std; int main() { vector<int> vec{ 1,2,3,4,5}; auto iter = vec.begin(); iter++; for (; iter != vec.end();) { iter = vec.insert(iter,8); iter++; iter++; } vec.insert(vec.end(),8); for (auto num : vec) cout << num << endl; return 0; }
這裏須要對iter首先自增一次,在循環最後,因爲iter自加兩次,已經和end()函數返回迭代器位置一致,因此須要再insert一次,才能在尾部再插入一個元素。
參考這篇文章:https://www.cnblogs.com/blueoverflow/p/4923523.html