C++迭代器刪除、插入元素

迭代器是容器五大組件中十分重要的一種,爲咱們提供了一種與容器種類、元素類型無關的訪問容器的方法。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

相關文章
相關標籤/搜索