news 2026/4/23 16:05:04

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

作者头像

张小明

前端开发工程师

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 9:58:47

安全工具篇魔改二开CheckSum8算法Beacon密钥Stager流量生成机制

免杀对抗——第一百六十四天 安全工具篇&魔改二开&CheckSum8算法&Beacon密钥&Stager流量&生成机制 前置知识 上节课我们对CS进行了简单的魔改操作&#xff0c;但是这些操作基本对流量识别影响不大&#xff0c;因此我们本节课会继续深入进行改动&#xf…

作者头像 李华
网站建设 2026/4/23 13:19:24

一篇 1948 年的论文,为什么至今仍在塑造我们的通信世界?

1948 年&#xff0c;克劳德E香农发表了一篇题为《通信的数学理论》的论文。彼时&#xff0c;它只是一篇看起来相当克制的技术论文&#xff0c;没有宏大的宣言&#xff0c;也没有铺陈未来图景。但正是这篇文章&#xff0c;在随后半个多世纪里&#xff0c;悄然塑造了我们今天所熟…

作者头像 李华
网站建设 2026/4/23 11:31:59

C语言字符串与内存操作函数模拟实现详解

一、strstr函数模拟实现 1.1 函数功能 strstr用于在字符串 str1中查找子串 str2的首次出现位置&#xff1a; const char* strstr(const char* str1, const char* str2); char* strstr(char* str1, const char* str2); 找到则返回第一次出现的起始地址 找不到则返回NULL 1…

作者头像 李华
网站建设 2026/4/23 10:11:21

去哪儿网白盒漏洞 AI 运营实践

前言 在当今快速发展的软件开发环境中&#xff0c;安全漏洞管理正在经历一场深刻的变革。随着 DevOps 理念的广泛普及&#xff0c;安全左移&#xff08;Shift Left Security&#xff09;已成为行业共识&#xff0c;企业纷纷将安全检测前置到开发流程的早期阶段&#xff0c;构建…

作者头像 李华
网站建设 2026/4/23 6:54:44

90%的项目失败,都是从需求管理开始崩塌的!

在产品更新节奏加快、项目复杂性日益提升的当下&#xff0c;许多企业在研发过程中面临着一个共同的难题&#xff1a;需求在流程中容易“丢失”或“变形”。从前端市场输入到后端技术实现&#xff0c;往往缺乏清晰的链条与协作机制&#xff0c;造成计划混乱、执行偏差、任务拖延…

作者头像 李华