STL使用迭代器逆向删除
2024-08-24 01:24:02
网上有很多这种例子:
void erase(vector<int> &v)
{
for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
{
if(*ri % 2 == 0)
{
cout << "Erasing " << *ri << endl;
v.erase((++ri).base());
//用base()函数将逆向iterator转换为正向的
}
else
{
++ri;
}
}
}
但这样再我自己的编译环境中始终异常中断,提示vector iterators incompatible,这种错误的原因就是迭代器与容器不兼容或者失效。
分析一下,erase函数执行完成后返回下个元素的指针,只要将这个指针转换成反向迭代器即可,一试果然如此。
void erase(vector<int> &v)
{
for(vector<int>::reverse_iterator ri=v.rbegin();ri!=v.rend();)
{
if(*ri % 2 == 0)
{
cout << "Erasing " << *ri << endl;
ri = vector<int>::reverse_iterator(v.erase((++ri).base())); //删除完要重置迭代器
}
else
{
++ri;
}
}
}
另附正向删除:
for (VectorType::iterator it = someVector.begin();; it != someVector.end();)
{ if (*it== value)
{
it = someVector.erase(it);
}
else
{
++it;
}
}
最新文章
- JS魔法堂:不完全国际化&;本地化手册 之 拓展篇
- C# 自定义序列化问题
- centos6.5搭建lnmp环境
- jQuery插件 -- Form表单插件jquery.form.js
- spring和redis的整合-超越昨天的自己系列(7)
- 安全终止MFC线程
- Java中Integer的源码学习
- java面向对象之 多态 Polymorphism
- Oracle 如何提交手册Cluster Table事务
- 如何查找Linux的函数定义的位置?
- Unity 3d中Shader是什么,可以吃吗?
- jsp 重定向技术
- 201521123034 《Java程序设计》第五周学习总结
- 第十三节,卷积神经网络之经典网络LeNet-5、AlexNet、VGG-16、ResNet(三)(后面附有一些网络英文翻译文章链接)
- BSGS与exBSGS学习笔记
- Cracking The Coding Interview 1.8
- WPF 网易云音乐PC端
- /etc/sudoers文件设置为允许用户在不输入该用户的密码的情况下使用所有命令
- Global and Local Coordinate Systems
- 记第一场atcoder和codeforces 2018-2019 ICPC, NEERC, Northern Eurasia Finals Online Mirror