迭代器是容器五大组件中十分重要的一种,为我们提供了一种与容器种类、元素类型无关的访问容器的方法。
按照是否提供修改容器元素内容、遍历方法等、迭代器可分为五大类,如下图所示:
有关五种迭代器的具体使用,可参考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
来源:https://www.cnblogs.com/fushi/p/7890046.html