博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Sweet Snippet系列 之 元素删除
阅读量:4224 次
发布时间:2019-05-26

本文共 1557 字,大约阅读时间需要 5 分钟。

1. 引子:

  平时代码总会遇到一些关于集合的操作,例如添加,排序等等,都可算作稀松平常,但是集合涉及的删除操作却一直有个大坑,我自己便跳进去过好几回,在此简单一记,以自警警人~

 

  2. 问题:

  删除整数容器中的偶数

 

  问题很简单,似乎一个简单的for循环就搞定了,就像这样:

#include 
#include
using namespace std;int main() { vector
vec = { 1, 2, 2, 3 };  auto isEven = [](int value) -> bool {    return (value & 1) == 0;   };   auto output = [&vec]() { for (auto v : vec) { cout << v << " "; } cout << "\n"; }; for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (isEven(*iter)) { vec.erase(iter); } } output(); return 0;}

代码虽易,可惜明眼人一看就知道问题所在了:erase操作会影响iterator的正常迭代!所以上面看似简洁的代码并不能产生正确的结果(就上面集合来说,我们会遗漏处理第三个元素,即2),我们必须采用另外的方法:

一种就是使用buffer(稍有些冗余):

// omit codes ...    {        vector
buffer; for (auto iter = vec.begin(); iter != vec.end(); ++iter) { if (!isEven(*iter)) { buffer.push_back(*iter); } } vec.swap(buffer); } // omit codes ...

近来还看到一种使用gototricky 方案(当然,个人不是很喜欢):

// omit codes ... restart:    for (auto iter = vec.begin(); iter != vec.end(); ++iter) {        if (isEven(*iter)) {            vec.erase(iter);            goto restart;        }    }       // omit codes ...

总的来说,我最认可的还是下面这种写法(平心而论,确实不及for形式简洁):

// omit codes ...   auto iter = vec.begin();    while (iter != vec.end()) {        if (isEven(*iter)) {            iter = vec.erase(iter);        }        else {            ++iter;        }    }         // omit codes ...

不知还有什么另外的方法,有兴趣的朋友可以告知一下 :)

 

OKThat’s all ~

转载地址:http://sizqi.baihongyu.com/

你可能感兴趣的文章
10大称霸Kaggle的深度学习技巧(附课程&代码&论文)
查看>>
干货 | 6 种激活函数核心知识点,请务必掌握!
查看>>
TensorFlow超级指南 | 你能想到的TF教程和资源都在这里(附链接&视频)
查看>>
干货收藏 | 计算机学习绝对不能错过的10大网站(内附网站链接)
查看>>
Kotlin威胁、Python逆袭,2018年程序员需要升级哪些技能?(附报告下载)
查看>>
综述 | 近年来深度学习的重要研究成果(附PDF)
查看>>
2018计算机图形学研究报告(附PDF下载)
查看>>
收藏 | 12个ggplot2拓展程序助你强化R可视化
查看>>
收藏 | 数据分析师最常用的10个机器学习算法!(附图解)
查看>>
收藏 | 15个CNN关键回答集锦,2019校招面试必备!
查看>>
独家|一文解读合成数据在机器学习技术下的表现
查看>>
竞赛 | 上汽拿出了2000辆车的真实数据集,千万级投资+直接录用机会等你来战!...
查看>>
盘点 | 2018全球人工智能突破性技术TOP10(附报告)
查看>>
干货 | 纽约大学陈溪: AlphaGo Zero技术演进的必然性(附PPT)
查看>>
竞赛 | 我们标注了34G真实线下门店数据,等你pick!
查看>>
独家 | 一文带你读懂特征工程!
查看>>
送你8个Python高效数据分析的技巧(附代码)
查看>>
13张动图助你彻底看懂马尔科夫链、PCA和条件概率!
查看>>
关于TensorFlow,你应该了解这9件事(附代码&链接)
查看>>
独家 | 一文读懂PySpark数据框(附实例)
查看>>