IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> vector的erase竞品:erase_if -> 正文阅读

[C++知识库]vector的erase竞品:erase_if

维尼的C++学习日志

vector的erase竞品:erase_if

最近在做项目的时候经常需要遍历一遍vector容器然后删除其中一些元素,但vector的删除时间复杂度是o(n)。原则上是用list会更好但我后续还需要下标访问的功能所以只能硬着头皮用vector.erase,但今天在翻看c++20新版本的一些特性的时候发现这个erase_if,使用简单而且速度超快,但具体不知道怎么实现的。

erase和erase_if

erase的用法大家应该都清楚的,我这边就随便写一段例程:下面展示一些 内联代码片

// erase
vector<int> vec1(300000);
for (int i = 0; i < vec1.size();i++) {
	vec1[i] = i;
}

for (auto it = vec1.begin(); it != vec1.end();) {
	if ((*it) % 10 == 0) {
		it = vec1.erase(it);
	}
	else {
		it++;
	}
}

erase_if的接口很简单,就是一个容器和一个函数对象,具体可以去cppreference上查一下。

// erase
vector<int> vec1(300000);
for (int i = 0; i < vec1.size();i++) {
	vec1[i] = i;
}

erase_if(vec1, [](int n) {
	return n % 10 == 0;
});

我自己电脑上出来的结果出来的结果大概是erase_if比erase快1000多倍···这个可能有点夸张了,我在公司试出来的结果差不多也就几十倍,但确实能证明这个函数很好用,很高效。

在发现这个函数之前,我还有一种自己整出来的方法,比较麻烦但是比vector的erase还是要快一些的。

// erase
vector<int> vec1(300000);
for (int i = 0; i < vec1.size();i++) {
	vec1[i] = i;
}

int ii = 0;
for (int i = 0; i < vec1.size(); i++) {
	if (i % 10 != 0) {
		vec1[ii++] = vec1[i];
	}
}
vec1.resize(ii);

这个方法就是直接在原来vector的基础上做赋值操作,避开了插入删除的o(n)操作,让速度变得很快,最后用resize整一下size,就搞定了。

int main() {
	
	vector<int> vec1(300000);
	for (int i = 0; i < vec1.size();i++) {
		vec1[i] = i;
	}

	int ii = 0;
	for (int i = 0; i < vec1.size(); i++) {
		if (i % 10 != 0) {
			vec1[ii++] = vec1[i];
		}
	}
	vec1.resize(ii);


	for (auto it = vec1.begin(); it != vec1.end();) {
		if ((*it)%10==0) {
			it = vec1.erase(it);
		}
		else {
			it++;
		}
	}

	erase_if(vec1, [](int n) {
		return n % 10 == 0;
	});


	cout << endl;
	return 0;
}

感觉除了这个erase_if之后,list的优势又少了一个,建议删了(不是)。
但毕竟C++20的新特性,可能会存在我并不清楚的劣势,如果有兄弟有不同的见解欢迎批评指正。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 10:58:44  更:2021-08-03 11:00:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 20:40:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码