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

强颜欢笑 提交于 2020-02-28 09:01:40

迭代器是容器五大组件中十分重要的一种,为我们提供了一种与容器种类、元素类型无关的访问容器的方法。

按照是否提供修改容器元素内容、遍历方法等、迭代器可分为五大类,如下图所示:

有关五种迭代器的具体使用,可参考CPPreference等权威资料。

首先贴一篇博客: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返回指向被删除元素下一元素的迭代器。(其实,我认为,返回的还是指定的迭代器,只不过它现在指向了被删除元素的下一元素,如有不对,恳请大家指正!)

     对于erase操作,还有一种写法是:

Vec.erase(itVec++)

不过需要注意,这种写法对vector、deque等容器无效!

上面两种写法,第一种对各种容器都有效,第二种写法只对map,list等容器有效。为了方便统一,还是建议采取第一种写法。

  • 增加元素

出于学习的目的,现在提出一个要求,如原有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

 

 

 

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!