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

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 530

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

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

qq_34113993的博客 1889

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 473

GlobalPlatform Technology Secure Channel Protocol ‘03‘ 标准 - 安全通道协议简介

按照GlobalPlatform Technology Secure Channel Protocol '03' (SCP03)标准,描述了如何利用S-MAC,S-RMAC,S-ENC进行安全通信的过程。

mmmx777的专栏 6093

C++ vector 动态数组的指定元素删除

文本旨在对 C++ 的容器 vector 进行肤浅的分析。

强风吹拂 4378

本届挑战赛亚军方案:基于大模型和多AGENT协同的运维

我们分别构建了异常检测基础模型,一旦系统接受到异常即会通知LLM主管Agent,主管Agent对异常问题进行决策与子领域Agent进行桥接,多个子领域Agent协同工作,实现运维故障自动诊断和多个任务模型的编排,提升运维效率。

weixin_52705010的博客 2295

用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

中国传媒大学计算机考研初复试经验贴

中传的计算机专业考研的话主要分为两大学院:计网学院和国重,大部分专业在计网学院。

DoKiDoK的博客 1565

AI人工智能与模拟退火:碰撞出的智慧火花

本文旨在为读者全面介绍模拟退火算法在人工智能领域的应用。我们将涵盖从基础理论到实际实现的完整知识体系,帮助读者理解这一受自然界启发的优化技术如何解决复杂的计算问题。文章首先介绍模拟退火的基本概念,然后深入其工作原理和数学基础,接着通过Python实现展示具体应用,最后讨论实际应用场景和未来发展方向。模拟退火(Simulated Annealing, SA):一种受物理退火过程启发的概率性优化算法能量函数(Energy Function):评估系统状态的函数,对应优化问题的目标函数。

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 453

一道腾讯笔试题,考察对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

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1486

c++蓝桥杯题目积累

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

2401_86043214的博客 242

告别 DEFINE VIEW:CDS View Entity 迁移全景实战(报表迁移 + ADT 向导 + 避坑清单)

CDS迁移的关键要点与策略 CDS DDIC-based View已被标记为废弃,迁移到CDS View Entity成为必要。迁移面临的主要挑战包括激活成本、命名约束和依赖风险。ABAP 7.57及以上版本必须优先处理,否则将积累技术债务。 迁移方式主要有两种: 报表路线:适合渐进式迁移的On-Premise项目 ADT向导:适合云环境批量迁移 关键注意事项: 必须提前检查SQL View依赖关系 金额/数量字段需要显式引用单位/货币字段 建议按使用场景分批迁移 最佳实践是结合报表进行系统盘点,再通过AD

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++进阶(05):哈希

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

2401_86650143的博客 1072

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_33912638的博客 493

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

第八章 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、付费专栏及课程。

余额充值