news 2026/4/16 18:05:28

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

作者头像

张小明

前端开发工程师

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/16 12:59:14

Windows C盘清理—— Android Studio .gradle 文件夹迁移

Windows C盘清理—— Android Studio .gradle 文件夹迁移 一、问题背景 在 Android Studio 开发过程中&#xff0c;Gradle 负责管理三方库、远程库的依赖&#xff0c;会自动下载 Maven 仓库中的 aar 或 jar 文件&#xff0c;并缓存到本地磁盘。随着开发项目的累积&#xff0c;G…

作者头像 李华
网站建设 2026/4/16 12:25:25

数据结构与算法绪论:为何学、学什么、如何避坑

引言&#xff1a;程序的灵魂工程师想象一下&#xff0c;你是一个收纳师。面对杂乱无章的房间&#xff0c;你会如何规划&#xff1f;是简单地把所有东西堆进箱子&#xff0c;还是根据物品的使用频率、尺寸、类别&#xff0c;设计一套专属的收纳系统&#xff1f;数据结构&#xf…

作者头像 李华
网站建设 2026/4/16 12:57:39

测试了Codebuddy的text to image 混元模型,自我设限

国内版&#xff0c;完成了一个稍长文件的写作之后&#xff0c;告诉我&#xff0c;额度已经用完了&#xff0c;但实际上还能用&#xff0c;不懂为什么。 为了测试100%额度用完之后是不是还能继续&#xff0c;画个图吧&#xff1a; 先是顶嘴&#xff0c;结果还是画了 模型是腾…

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

CommandLineParser 完全指南:让命令行参数解析变得简单优雅

CommandLineParser 完全指南&#xff1a;让命令行参数解析变得简单优雅 2026-02-03 8分钟阅读 作为.NET开发者&#xff0c;我们经常需要开发命令行工具。无论是构建脚本、实用工具还是控制台应用&#xff0c;优雅地处理命令行参数都是必备技能。今天我要介绍的是.NET生态中最强…

作者头像 李华
网站建设 2026/4/15 14:34:44

旧PHP版SakuraFrpApi

/*** SakuraFrp API 客户端* 仅实现了获取隧道列表的功能** version 1.0* author AI Assistant*/ class SakuraFrpApi {/*** API 基础 URL* var string*/private const BASE_URL https://api.natfrp.com/v4;/*** 用户认证 Token* var string*/private $userToken;/*** 构造函数…

作者头像 李华
网站建设 2026/4/16 16:00:56

【完全免费】一键锁定电脑键盘和鼠标,防止小孩舍友同事触碰自己的电脑。如何让电脑键盘鼠标失效?这款神器轻松帮你解决!

——软件使用教程—— 一键锁定电脑键盘和鼠标&#xff0c;防止小孩舍友同事触碰自己的电脑。——下载地址&#xff08;防止被拦截&#xff0c;请用浏览器打开&#xff09;—— 夸克地址&#xff1a; https://pan.dxlszyk.com/s/1jghdt106 多盘地址&#xff1a; https://ww…

作者头像 李华