C++中vector和set删除一亿个数字中的奇数

C++ STL replace算法详解:从基础原理到实战应用 在C++编程中,数据处理与转换是常见的核心任务,而STL(标准模板库)算法提供了高效、泛型的解决方案。其中,replace算法系列作为基础且强大的工具,实现了对容器或字符串中元素的批量替换操作。其原理基于迭代器抽象,通过遍历指定范围并比较元素值或执行谓词判断,将符合条件的元素替换为新值,体现了声明式编程的思想。该技术的价值在于提升代码的简洁性、可读性和可维护性,避免了手动编写循环可能引入的错误。在实际工程中,replace算法广泛应用于数据清洗、字符串处理、状态更新等场景。例如,在数据预处理时,可使用rep 阅读详情

一、vector

先贴代码再解释:
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

const unsigned int NUM = 100000000;

void removeOdd1(vector<int>& a)
{
	for(vector<int>::iterator it = a.begin();it!=a.end();)
	{
		if((*it)%2==1)
		{
			it = a.erase(it);//注意这里和set的区别,erase当前元素后面的元素会自动不过了所以不需要++了
		}
		else
		{
			it++;
		}
	}
}

bool isOdd(unsigned int x)
{
	if(x%2==1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void removeOdd2(vector<int>& a)
{
	a.erase(remove_if(a.begin(), a.end(), isOdd),a.end());
}


int main()
{
	vector<int> a(NUM, 0);
	for(unsigned int i=0;i<NUM;++i)
	{
		a[i] = i;
	}
	
//	removeOdd1(a);
	removeOdd2(a);
	
	return 0;
}
一般情况下我们最直观的方法就是用方法一,对于小数据量这些都没有问题,但是数据量大时运行速度就不行了。这是因为vector其实是对数组的封装你每找到一个奇数就移除那么其后面的数据是要向前移动的也即是每次删除一个元素后面的每个元素就要移动一次。对于一亿的数据量我在我的笔记本上没有等到运行结果!对于方法二remove_if()函数的原理是把vector中的偶数拷贝到另一个个vector中(其实remove_if()是在同一个vector上操作的),也即a中前一段存的是偶数而后一段存的还是原理的值,remove_if()返回的是所有符合条件的数据的下一个位置,因此使用a.erase()擦除后面的数据。以下代码是对其进行的验证:
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

const unsigned int NUM = 10;

bool isOdd(unsigned int x)
{
	if(x%2==1)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	vector<int> a(NUM, 0);
	for(unsigned int i=0;i<NUM;++i)
	{
		a[i] = i;
	}
	
	vector<int>::iterator t = remove_if(a.begin(), a.end(), isOdd);
	a.erase(t, a.end());
	for(vector<int>::iterator it = a.begin(); it<t; ++it)
	{
		cout << *it << endl;
	}
	cout << endl;
	for(vector<int>::iterator it=t; it<a.end(); ++it)
	{
		cout << *it << endl;
	}
	
	return 0;
}

二、set

#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

//const unsigned int NUM = 100000000;
const unsigned int NUM = 100;//因这里建树比较慢所以取值小了点

void removeOdd1(set<int>& s)
{	
	for(set<int>::iterator it = s.begin(); it!=s.end();++it)//注意这里和vector的不同,即使erase当前元素迭代器还是要++
	{
		if((*it)%2==1)
		{
			s.erase(it);
		}
	}
}

int main()
{
	set<int> s;
	for(unsigned int i=0; i<NUM; ++i)
	{
		s.insert(i);
	}
	removeOdd1(s);

	return 0;
}

set是使用红黑树实现的因此插入和删除操作都在lg(n)时间内完成,因此直接删除就可以了。set是一个集合适合查找元素,而vector是一个连续的内存空间可以随机存取。但从查找一个元素来看set的效率要比vector高。

1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector

2、如果你要查找一个元素是否在某集合内存中,则使用set存储这个集合比较好


C++算法面试精讲:华为机试103题核心考点与实战解析 算法与数据结构是计算机科学的核心基础,它们通过定义数据的组织方式和操作规则,为解决复杂问题提供了高效框架。其原理在于利用空间换时间或时间换空间的策略,优化程序执行效率。掌握经典算法如动态规划、深度优先搜索和双指针,对于提升代码性能、解决大规模数据处理问题具有重要技术价值。在工程实践中,这些技术广泛应用于搜索引擎、推荐系统、实时通信等高性能场景。本文以C++语言为载体,结合华为技术面试中的高频考点,深入剖析字符串处理、数组操作、栈队列应用等常见题型,通过解析动态规划、回溯法等核心解题框架,帮助开发者系统构建算 阅读详情

相关推荐

C++笔记之使用set对vector去重(去除重复元素)封装成函数模板

C++笔记之使用set对vector去重(去除重复元素)封装成函数模板

小勇博客 674

C++使用STL容器删除奇数并排序(vector,list,forward_list,deque,priority_queue)

C++使用STL容器删除奇数并排序(vector,list,forward_list,deque,priority_queue) vector.cpp #include<vector> #include<iostream> #include<algorithm> using namespace std; int main() { vector<int> vec = { 2,8,3,4,9,7,5,6,1,10 }; auto ve = vec

weixin_51649465的博客 355

从零开始:PLUMED与GROMACS整合安装全攻略

本文详细介绍了如何从零开始整合安装PLUMED与GROMACS,包括系统环境检查、MPI配置、PLUMED编译安装、GROMACS补丁应用及常见问题解决方案。通过本教程,研究人员可以快速完成分子动力学模拟工具的整合安装,实现增强采样和自由能计算功能。

weixin_42520796的博客 292

C++ vector使用erase()删除元素时的注意事项

在使用erase()删除元素时,如果不清楚该函数实现原理,可能会造成莫名的bug, 正常情况下使用for循环查找vector中元素是否满足条件时一般会用错误演示中的代码,但这种情况可能会导致段错误,原因在于,如果it当前为最后一个元素的迭代器,那么将会返回无效地址,此时将执行it++;正是这条语句导致的地址非法即段错误,因此要解决该问题,那么就需要将it回退到n-1处的地址,或者修改for循环,...

qq_34113993的博客 1889

emwin与Modbus通信结合:项目实例

通过实际项目讲解emwin界面设计与Modbus通信协议的融合应用,深入剖析数据交互流程。掌握emwin在工业控制场景中的实用技巧,提升系统人机交互与稳定通信能力。

weixin_34618526的博客 483

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南

本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。

weixin_29209825的博客 455

用vector或者set删除一亿个数里的奇数

如何用vector或者set删除一亿个数里的奇数 先说说VECTOR怎么删除指定的元素,因为VECTOR有迭代器失效的问题,一般人都会写这么样的一个函数 for(vector::itertor it=a.begin();it!=a.end();) { if(a[i]%2==1) it=a.erase(it); else it++; } 这样的函数如果数据量很小的话

星辰大海 1562

从零训练Qwen3-VL

如果你未来想做的是「在公开权重上继续做大规模多模态 pretrain(比如换数据、换目标函数)」而不是在完全随机初始化上起步,这两类代码会比 Open-Qwen2VL 更直接。参考 Qwen2-VL / Qwen2.5-VL 披露的流程,可以大致推测 Qwen3-VL 也是类似的三阶段:(直接在学术算力(8×A100-40G)上从零预训练了一个 2B 参数的多模态 Qwen2-VL 风格模型:(的配置和训练脚本,理解它是如何把「任意 ViT + 任意 LLM + 任意图文数据」拼在一起的。

u013250861的博客 566

C++之STL中set的用法总结

set概述和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后,迭代器会不会失效呢?删除set的数据时,实际的操作是删除红黑树中的一个节点,然后相关指针做相关调整。指向其他元素的迭代器还是指向原位置,并没有改变,所以删除一个节点后其他迭代器不会失效。list和map也是同

不积跬步,无以至千里 2万+

ONVIF协议简介与协议测试工具使用详解

Onvif协议及协议测试工具使用详解

dvlinker的技术专栏 3万+

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50154_Office2007.msi 3.Microso

业精于勤,荒于嬉 3万+

一道腾讯笔试题,考察对STL erase函数的运用

题目是这样的:有1亿个不同QQ号分别保存在vector和set中,去掉其中的奇数QQ号。 在STL中erase函数是这样定义的: void container::erase(iteraor pos) iteratot container::erase(iterator pos) 将迭代器pos位置所指的元素移除。序列式容器(vector、deque、list和string)采用

u011639330的专栏 473

上位机 寻边器 通讯实战

寻边器通讯接口实现 本文介绍了上位机与盖泽(Gazer)和JEL品牌寻边器的通讯接口实现方案。主要内容包括: 接口定义:创建了IAlignerOperation接口,定义了获取状态、控制运动、真空吸附等核心功能。 具体实现: 盖泽寻边器(GazerAlignerCjh):通过串口通讯,实现了回零、校准、移动位置等操作 JEL寻边器(JelAligner):同样基于串口通讯,包含错误处理、状态查询等功能 工厂模式:通过AlignerFactory工厂类根据设备品牌创建对应的实现对象。 设备加载:展示了如何在系

StevenChen的博客 380

c++蓝桥杯题目积累

P1055 [NOIP 2008 普及组] ISBN 号码 - 洛谷

2401_86043214的博客 242

ABAP Development Tools 3.62 搭配 Claude Code,已经从旁路方案走到了 SAP 官方 MCP 路线

截至2026年10月,ABAP Development Tools 3.62已通过官方ADT MCP Server实现与Claude Code的深度集成。Claude Code作为MCP客户端,可直接调用ABAP Repository的完整开发能力,包括读取、创建、修改、激活对象及运行ATC、ABAP Unit等操作,无需依赖本地文件或第三方封装。SAP新增的精准编辑(abap_object_edit_file)和符号检索(abap_object_get_document_symbols)工具,有效控制风险

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 29

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C++进阶(05):哈希

本文整合C++哈希全套笔面试核心考点,先对比有序红黑树容器map/set与无序哈希容器unordered_map/unordered_set的底层、复杂度、适用场景;再讲解哈希基础、冲突解决方式,重点给出笔试必考的链地址法哈希桶完整模拟实现;接着介绍位图与布隆过滤器原理、可默写代码、优缺点,最后总结海量数据高频面试题解题思路。

2401_86650143的博客 1072

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从SNCPC2024“消失的数字”解析信奥C++刷题:算法、环境与调试

在算法竞赛和编程学习中,数据结构与算法是核心基础,它们决定了程序的效率和正确性。其原理在于通过合理的逻辑组织和数学优化,将问题转化为计算机可高效执行的操作。掌握经典算法能极大提升解决实际工程和竞赛问题的能力,例如在处理大规模数据查找、排序或资源优化时。常见的应用场景包括在线评测系统(OJ)刷题、技术面试准备和软件开发中的性能优化。本文以一道典型的竞赛题为例,深入探讨了求和法与异或法等不同解法的实现细节,并详细介绍了如何利用VSCode搭建高效的C++开发环境,帮助读者系统性地提升从问题分析、代码编写到调试优

weixin_33912638的博客 493

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

第八章 STL、位运算、常用库函数

函数有:size/empty,clear,begin/end,front/back,输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3。使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分。的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围 0。输入一个链表的头结点,按照 从尾到头 的顺序返回节点的值。输入一个整数数组,实现一个函数来调整该数组中数字的顺序。例如输入排序数组 [1,2,3,3,3,3,4,5]输入:[1,2,3,4,5,6,7,8] , k=4。

weixin_44356316的博客 924

C++语言程序设计——【算法竞赛常用知识点】❁´◡`❁

是不是模拟题?⏭️暴力模拟✅【题目做什么就干什么、有步骤、有流程、按照规则】(关键词):一步步操作、轮流、每次按步骤、走流程、按照规则、有删除/移动/变换/重新排列等)// 先用一个东西存当前状态(数组、vector、字符串)// 初始化(把一开始的东西放进去)while(没结束) { // 循环直到题目要求结束按题目规则操作 // 做今天/这次的操作更新状态 // 更新状态(剩下的东西替换掉原来的)举例:● 苹果每天拿走一些● 字符串每次移动第一个字符。

小宇y的博客 1386

语法基础之STL、位运算与库函数

1、vector 可以自动改变数组长度 vector是变长数组,支持随机访问,不支持在任意位置O(1)插入。为了保证效率,元素的增删一般应该在末尾进行。 声明 #include 头文件 vector a; 相当于一个长度动态变化的int数组 vector b[233]; 相当于第一维长233,第二位长度动态变化的int数组 struct rec{…}; vector c; 自定义的结构体类型也可以保存在vector中 size/empty size函数返回vector的实际长度(包含的元素个数)

qq_37448336的博客 713

2024 PTA天梯赛C++选手实战复盘:从字符串处理到二分查找的竞赛技巧

在算法竞赛和编程实践中,字符串处理与二分查找是基础且高频的技术点。字符串处理涉及输入解析、格式转换和边界条件控制,其核心在于对数据结构的精准操作和异常情况的周全考虑。二分查找则体现了分治思想,通过不断缩小搜索范围实现对数级时间复杂度,关键在于循环不变量和中间值计算的正确处理。掌握这些基础技术能显著提升代码的鲁棒性和执行效率,在实时评测、数据处理等场景中尤为重要。本文结合2024年PTA天梯赛的实战案例,深入剖析字符串解析中stringstream的使用技巧和二分查找模板的可靠实现,帮助选手在竞赛中稳定发挥。

weixin_30655569的博客 384

C++基础语法全解析:从Hello World到面向对象编程入门

编程语言的核心在于其语法体系,它定义了代码的组织结构和执行逻辑。C++作为一门支持多范式编程的系统级语言,其语法设计兼顾了底层硬件操作与高级抽象能力。理解变量、数据类型、运算符和控制流等基本语法元素,是掌握任何编程语言的基石。这些概念共同构成了程序的数据表示、运算逻辑和执行路径控制。在工程实践中,扎实的语法基础能有效提升代码的可靠性、可维护性和性能表现,尤其在对执行效率有严苛要求的系统软件、游戏引擎和高频交易等场景中至关重要。本文聚焦C++基础语法,通过剖析Hello World程序结构、变量与数据类型、运

weixin_30243533的博客 374

C/C++ 一些知识点总结

临时整理的,有些可能不对。 1)如果一个类里面有const-qualifier或reference, compiler不会为它生成default copy assignment operator函数。 2) Hidden是指子类和父类有同名函数,但又没有virtual关键字。这里函数只要同名就可以了,参数并不需要match。也就是说,compiler只要在子类看到有这个函数名,即使参数不...

roufoo的博客 3405

std::hive:C++26兼顾指针稳定与缓存友好的容器

C++容器设计总是在“访问速度”与“元素稳定性”之间权衡。传统数组提供连续存储和随机访问,但删除中间元素会引发大规模搬移;链表则能保证指针稳定,却要付出独立节点分配和缓存局部性降低的代价。为调和这对矛盾,C++26标准草案引入了基于分块内存与空闲槽位管理的新容器——std::hive(早期版本多以colony名称传播)。它能在常数时间内完成插入和删除操作,使未被删除元素的迭代器、指针和引用保持有效,同时借助块式布局获得优于链表的缓存局部性。这一特性让std::hive特别适合游戏实体管理、事件回调集合、对象

weixin_34008933的博客 384

C++ 竞赛学习路线笔记

求和:求乘积:交换两个数:输入整数:输出整数:n 能被 i 整除:偶数:奇数:最大值:,最小值:,统计数量:循环 1~n:输入 n 个数:中断循环:跳过本轮:输入若干数:输入 n 个值:倒序输出: 主对角线:副对角线:字符数组长度:,字符串长度:,整行读取:截取子串:查找字符:,未找到返回 替换内容:删除字符:插入字符:转整数:,(long long)整数转字符串:升序: 需 降序:幂:int 绝对值:float 绝对值:平方根:最大/最小:,向下取整:向上取整:两点距离: 3. set 集合(自动去重

博樽 563
上一篇: 程序开发辅助工具
下一篇: 条款27:尽量少做转型操作
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值