最近,在看书的时候,偶然间发现一个细节:就是vector的erase操作。对于这个erase操作,大家都清楚,这个删除操作有2种形式,(1)删除单个元素,参数是迭代器变量;(2)删除区间元素,参数是begin和end。而细节就是在删除单个元素的时候,发生的具体事情。
例如:有一个vector,是这样初始化的,vectorbd43222e33876353aff11e13a7dc75f6 va{0,1,2,2,3,4,5},删除掉vector中 元素等于2的!
通常代码是这样写的:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); for (auto i = va.begin();i != va.end(); i++) { if (*i == 4) { i = va.erase(i); } } for (auto i : va) { std::cout << i << " "; } return 0; }
乍一看并无不妥之处,然而结果却出乎意料
为什么结果会是这样呢?仔细想想了,原来是在删除的地方出了错误,当if条件成立之后,vector进行删除操作,删除掉vector中符合条件的元素,重点来了,当vecotr执行erase操作的之后,返回的值表示当前被删除迭代器的下一位置,注意,是下一个位置,然后,当再次循环的是,迭代器又向后移动了一个位置,导致接下来相同的元素并没有被删除。
附上正确写法:
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; std::vector<int> vb(va); auto iter = vb.begin(); while(iter!=vb.end()) { if (iter != vb.end()) { if (*iter == 4) { iter = vb.erase(iter); } else { iter++; } } } for (auto j : vb) { std::cout << j << " "; } return 0; }
#include <vector> #include <iostream> int main() { std::vector<int> va{ 1,2,3,4,4,5,6 }; for (auto i = va.begin();i != va.end(); ) { if (*i == 4) { i = va.erase(i); } else { i++; } } for (auto i : va) { std::cout << i << " "; } return 0; }
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章
R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
刺客信条阴影:贝壳谜语解决方案
1 周前ByDDD
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
在哪里可以找到原子中的起重机控制钥匙卡
1 周前ByDDD

热工具

SublimeText3汉化版
中文版,非常好用

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。