news 2026/5/1 0:04:37

常用算法(下)---拷贝、替换、算术生成、集合算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
常用算法(下)---拷贝、替换、算术生成、集合算法

常用算法(下)

一、常用拷贝和替换算法
1.copy

容器内指定范围内的元素拷贝到另一容器中。函数原型:

copy(iterator beg,iterator end,iterator dest);

使用示例:

void print01(int val) { cout << val << " "; } //copy void test01() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } for_each(v.begin(), v.end(), print01); cout << endl; //copy复制 vector<int>v2; v2.resize(v.size());//复制时,空容器一定要预先指定大小 copy(v.begin(), v.end(), v2.begin()); for_each(v2.begin(), v2.end(), print01); cout << endl; }

空容器一定要提前开辟空间

2.replace

将指定范围内的旧元素修改为新元素。函数原型:replace(iterator beg,iterator end,old value,newvalue);

void test02() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } cout << "befor replace:" << endl; for_each(v.begin(), v.end(), print01); cout << endl; //替换 cout << "after replace: " << endl; replace(v.begin(), v.end(), 0, 10); for_each(v.begin(), v.end(), print01); cout << endl; }
3.replace_if

将区间内满足条件的元素,替换成指定元素。函数原型:replace_if(iterator beg,iterator end,_pred,newvalue);

class myPlace { public: bool operator()(int val) { return val < 7;//我的条件,小于7的都满足我需要替换的条件 } }; void test03() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } cout << "替换前:" << endl; for_each(v.begin(), v.end(), print02());// 0 1 2 3 4 5 6 7 8 9 cout << endl; //替换 cout << "替换后:" << endl; replace_if(v.begin(), v.end(), myPlace(), 7);//所有满足myPlace条件的都将替换成7 for_each(v.begin(), v.end(), print02());// 7 7 7 7 7 7 7 7 8 9 cout << endl; }

_Pred是谓词,也是我们需要写的替换条件

4.swap

互换两个容器中的元素。函数原型:swap(container c1,container c2);

void test04() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int>v2; for (int i = 100; i < 110; i++) { v2.push_back(i); } cout << "before swap:" << endl; for_each(v.begin(), v.end(), print01); cout << endl; for_each(v2.begin(), v2.end(), print02()); cout << endl; //交换 cout << "after swap:" << endl; swap(v, v2); for_each(v.begin(), v.end(), print01); cout << endl; for_each(v2.begin(), v2.end(), print02()); cout << endl; }

两个容器必须是同一种类型,不需要留空间,二者大小直接交换

二、常用算术生成算法

算术生成算法属于小型算法,使用时应包含头文件#include<numeric>

1.accumulate

计算区间内容器元素累计总和accumulate(iterator beg,iterator end,value);value为起始叠加值,即从什么开始累加

void test05() { vector<int>v; int sum = 0; for (int i = 0; i <= 10; i++) { v.push_back(i); sum += i; } int sum1 = accumulate(v.begin(), v.end(), 0); cout << sum << endl;//55 cout << sum1 << endl;//55 }

应用:评委打分,累加分数,若value为0,则从0开始加,若value为100,则从100开始加,即容器内部元素总和加value为最终输出的值。

2.fill

向容器中填充指定的元素。函数原型:fiil(iterator beg,iterator end,value);value为填充的值

void test06() { vector<int>v; v.resize(7);//指定容器大小,默认为0;现在是7个0 for_each(v.begin(), v.end(), print01);//0 0 0 0 0 0 0 cout << endl; //后期重新填充 fill(v.begin(), v.end(), 6); for_each(v.begin(), v.end(), print01);//6 6 6 6 6 6 6 cout << endl; }
三、常用集合算法
1.set_intersection

求解两个容器的交集set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);求解两个容器的交集,并将交集放在目标容器中dest

void test07() { vector<int>v1; for (int i = 0; i < 10; i++) { v1.push_back(i); } vector<int>v2; for (int i = 5; i < 18; i++) { v2.push_back(i); } vector<int>v3; v3.resize(min(v1.size(),v2.size())); //交集最好的情况就是其中一个容器是完全包含在另一个容器中的,所以最大的交集个数为二者大小最小的 //获取交集 vector<int>::iterator pos = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); //元素个数没有容器容量大的话,会以默认值0填充,所以我们会使用它返回的结束迭代器 for_each(v3.begin(), pos, print01); cout << endl; }

函数的返回值是一个迭代器,是求解的交集中的最后一个元素的位置。遍历时,就使用这个迭代器,两个源容器需要是有序的序列才可以

2.set_union

求两个集合的并集set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序序列

void test08() { vector<int>v1; for (int i = 0; i < 12; i++) { v1.push_back(i); } vector<int>v2; for (int i = 6; i < 17; i++) { v2.push_back(i); } vector<int>v3; v3.resize(v1.size()+v2.size());//最坏情况下,是两个容器内的元素都不相同,所以最大的是两个容器的大小和 vector<int>::iterator pos = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), pos, print01);//遍历结束在返回的容器结束迭代器位置,否则会以0补充 cout << endl; }

返回的结果是一个迭代器,是求解的并集中的最后一个元素的位置

3.set_difference

求两个集合的差集set_difference(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);两个集合必须是有序的序列。求解两个容器的差集,第一个容器和第二个容器的差集是指第一个容器中没有出现在第二个容器中的元素

void test09() { vector<int>v1; for (int i = 0; i < 13; i++) { v1.push_back(i); } vector<int>v2; for (int i = 7; i < 18; i++) { v2.push_back(i); } for_each(v1.begin(), v1.end(), print01);//0 1 2 3 4 5 6 7 8 9 10 11 12 cout << endl; for_each(v2.begin(), v2.end(), print01);//7 8 9 10 11 12 13 14 15 16 17 cout << endl; //求差集 cout << "v1和v2的差集:" << endl; vector<int>v3; v3.resize(max(v1.size(),v2.size())); vector<int>::iterator pos = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin()); for_each(v3.begin(), pos, print01);//0 1 2 3 4 5 6 cout << endl; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 22:35:20

【贪嗔痴】低频量化周报(指数风险溢价比,配债完整数据集,可转债策略,上市公司礼品,交易总结)

低频量化周报&#xff08;2026-01-30&#xff09;指数风险溢价比小规模配债<5亿配债完整数据5 批文通过4 发哥通过3 交易所受理2 股东大会通过1 董事会预案可转债策略双低策略低溢价策略小盘低价格策略小盘低溢价策略溢价偏离策略上市公司实物礼品孚日股份(002083)2026-01-2…

作者头像 李华
网站建设 2026/4/28 0:05:16

Qwen3-ASR-0.6B实战:一键将音频转文字,隐私安全无忧

Qwen3-ASR-0.6B实战&#xff1a;一键将音频转文字&#xff0c;隐私安全无忧 你是否遇到过这些场景&#xff1a; 会议录音堆在文件夹里迟迟没整理&#xff0c;灵感闪现时语音备忘录听不清&#xff0c;采访素材要花半天手动打字&#xff0c;又或者——你根本不敢把客户会议、内部…

作者头像 李华
网站建设 2026/4/30 3:26:37

基于Flink CDC的企业级日志实时入湖入流解决方案

作者&#xff1a;徐榜江(雪尽) —— 阿里云Flink数据通团队负责人&#xff0c;Flink PMC成员&#xff0c;Flink CDC开源项目负责人李昊哲(米灵) —— 阿里云Flink高级产品经理&#xff0c;负责阿里云Flink稳定性、可观测性、数据摄入等企业级产品特性摘要本文主要介绍阿里云基于…

作者头像 李华
网站建设 2026/4/30 20:43:53

使用 Depth Anything V2 进行单目深度估计

原文&#xff1a;towardsdatascience.com/monocular-depth-estimation-with-depth-anything-v2-54b6775abc9f?sourcecollection_archive---------4-----------------------#2024-07-24 神经网络是如何从二维图像中学习估计深度的&#xff1f; https://medium.com/neural.avb?…

作者头像 李华
网站建设 2026/4/26 20:03:33

什么是住宅代理IP?

什么是住宅代理IP&#xff1f; 住宅代理IP是一种特殊类型的代理服务&#xff0c;采用的IP地址为居民住宅网络IP地址。这种特殊类型的代理服务可以模拟真实用户的上网行为和位置信息&#xff0c;从而更好地保护用户的隐私&#xff0c;并且比其他类型的代理服务更难被网站或应用…

作者头像 李华