Sweet Snippet系列 之 元素删除
时间:2022-06-05
本文章向大家介绍Sweet Snippet系列 之 元素删除,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. 引子:
平时代码总会遇到一些关于集合的操作,例如添加,排序等等,都可算作稀松平常,但是集合涉及的删除操作却一直有个大坑,我自己便跳进去过好几回,在此简单一记,以自警警人~
2. 问题:
删除整数容器中的偶数
问题很简单,似乎一个简单的for循环就搞定了,就像这样:
#include <vector>
#include <iostream>
using namespace std;
int main() {
vector<int> 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<int> buffer;
for (auto iter = vec.begin(); iter != vec.end(); ++iter) {
if (!isEven(*iter)) {
buffer.push_back(*iter);
}
}
vec.swap(buffer);
}
// omit codes ...
近来还看到一种使用goto的tricky 方案(当然,个人不是很喜欢):
// 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 ...
不知还有什么另外的方法,有兴趣的朋友可以告知一下 :)
OK,That’s all ~
- 3039: 玉蟾宫
- 大公司都有哪些开源项目之腾讯
- Vue拖拽组件开发实例
- 一小时培训之神经网络入门
- 【LeetCode 290】 关关的刷题日记28 Word Pattern
- Redis知识点速查
- 上传伪技术~很多人都以为判断了后缀,判断了ContentType,判断了头文件就真的安全了。是吗?
- SpringBoot的微信点餐系统后台开发要点
- 【LeetCode 463】 关关的刷题日记29 Island Perimeter
- 搭建移动端的跨平台开发环境
- 30分钟全面解析-SQL事务+隔离级别+阻塞+死锁
- 【最新TensorFlow1.4.0教程03】利用Eager Execution构建和训练卷积神经网络(CNN)
- 360护心镜脚本分析及N种绕过方式
- 清北集训Day6T1(生成函数)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 程序这么慢罪魁祸首竟是它
- 知识卡片 信息熵
- 算法篇:树之路径之和
- 听说同学你搞不懂Java的LinkedHashMap,可笑
- 揭开数组的真面目
- DLL导出函数Interface与实现分离
- DUI -实现GDI透明效果
- maven 打包过滤二进制压缩与静态文件失效的事情
- The container name “/xx“ is already in use by container “xx“. You have to remove (or rename) that
- ClickHouse的可视化工具Tabix
- 跳表
- 浅谈AQS
- linux进程调度
- 696. 计数二进制子串 Krains 2020-08-10 09:42:23 字符串
- 给你的热图挑选一个合适的渐变色