news 2026/7/12 16:08:01

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

作者头像

张小明

前端开发工程师

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/7/9 9:25:37

Python 中的 click 框架

一、什么是 Click 框架Click 是 Python 生态中最流行的第三方 CLI 开发框架&#xff0c;由 Flask 作者 Armin Ronacher 开发&#xff0c;核心优势是&#xff1a;语法简洁&#xff08;基于装饰器&#xff09;&#xff0c;比 Python 标准库 argparse 更易上手支持丰富的功能&…

作者头像 李华
网站建设 2026/7/6 1:16:46

OpenAI RLHF原论文深度解析:一文掌握大模型强化学习PPO算法精髓

本文详细解读OpenAI的RLHF奠基论文&#xff0c;介绍通过三步训练InstructGPT&#xff1a;1)SFT阶段用13k人工标注数据微调GPT-3&#xff1b;2)训练RM模型对response打分&#xff1b;3)使用PPO算法优化LLM。实验表明1.3B参数的InstructGPT效果优于175B GPT-3&#xff0c;文章提供…

作者头像 李华
网站建设 2026/7/1 12:35:05

B帧导致PTS DTS不一致的原理

1. 核心概念DTS&#xff08;Decoding Time Stamp&#xff09;&#xff1a;解码时间戳&#xff0c;决定「什么时候解码这一帧」&#xff0c;严格遵循解码顺序。PTS&#xff08;Presentation Time Stamp&#xff09;&#xff1a;显示时间戳&#xff0c;决定「什么时候显示这一帧」…

作者头像 李华
网站建设 2026/7/1 15:25:33

老旧CentOS7服务器JVM加载Jar缓慢排查:竟与NTP服务器有关

老旧CentOS7服务器JVM加载Jar缓慢排查&#xff1a;竟与NTP服务器有关 近期维护一批老旧CentOS 7服务器时&#xff0c;遇到一个十分诡异的JVM故障——使用Java 8加载Jar包时速度异常缓慢&#xff0c;往往要等待数分钟甚至超时&#xff0c;而相同服务器切换到Java 17后&#xff0…

作者头像 李华
网站建设 2026/7/1 12:35:05

Tiez 贴汁 高效的剪贴工具

官方网站 https://tiez.name666.top/zh/ Tiez 贴汁 一贴即合&#xff0c;原汁原味。 不仅是高效的剪贴工具&#xff0c;更是您工作流中值得信赖的“铁汁”。

作者头像 李华
网站建设 2026/7/1 12:35:07

Git-RSCLIP企业级应用:国土调查外业核查前的自动化地物预判

Git-RSCLIP企业级应用&#xff1a;国土调查外业核查前的自动化地物预判 1. 为什么外业核查前需要“预判”&#xff1f; 你有没有遇到过这样的情况&#xff1a;一支国土调查队伍带着设备奔赴几十公里外的田间地头&#xff0c;结果发现——拍回来的照片里&#xff0c;本该是“设…

作者头像 李华