当前位置: 首页 > news >正文

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

常用算法(下)

一、常用拷贝和替换算法
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; }
http://www.jsqmd.com/news/340258/

相关文章:

  • 前端技术经理:角色、职责与面试指南
  • Python 中的 click 框架
  • 2026年初至今,国内顶尖气力输送供应商综合评估报告 - 2026年企业推荐榜
  • 2026年秦皇岛开放式厨房定制指南:口碑厂家深度解析 - 2026年企业推荐榜
  • 2026年青海舟谱数据服务商综合评估与精选报告 - 2026年企业推荐榜
  • 2026年当下乌鲁木齐舟谱公司哪家好 - 2026年企业推荐榜
  • 2月3日面试题整理 字节跳动后端开发相关
  • 2026年Q1长沙玻璃胶实力厂家综合评选与选型指南 - 2026年企业推荐榜
  • Java 线程池线程数怎么定?从 IO / CPU / 混合型任务谈起
  • 长沙结构胶工厂盘点:五家本地优质服务商推荐 - 2026年企业推荐榜
  • 2026年贵州防撞板生产商综合评估与选购指南 - 2026年企业推荐榜
  • 2026年靠谱墙板厂家推荐榜单 - 2026年企业推荐榜
  • 2026年第一季度优质集成墙板定做厂家综合评估报告 - 2026年企业推荐榜
  • 五大热门远程控制软件全方位测评,2026年远控王者花落谁家?
  • 2026年陕西基本农田调整技术服务公司综合盘点 - 2026年企业推荐榜
  • 2026年国土空间规划调整技术服务商综合实力排行与选型指南 - 2026年企业推荐榜
  • Windows C盘清理—— Android Studio .gradle 文件夹迁移
  • 专业级模型 GLM-OCR
  • 谷歌发布 Project Genie:基于文本生成可互动 3D 虚拟世界
  • 2026年北海地区信誉优良的合成高温润滑脂厂家综合评估 - 2026年企业推荐榜
  • 福州合成高温润滑油厂商深度评测与选型指南 - 2026年企业推荐榜
  • 2026年斜管填料制造厂综合评估与优选指南 - 2026年企业推荐榜
  • 2026年成都石膏板厂家综合评估与优选指南 - 2026年企业推荐榜
  • 数据结构与算法绪论:为何学、学什么、如何避坑
  • 四川钻石全能高基板厂家综合实力TOP5评选(2026版) - 2026年企业推荐榜
  • 成都石膏板厂家市场现状与可靠品牌推荐 - 2026年企业推荐榜
  • 2026年2月最新靠谱的四川石膏板工厂 - 2026年企业推荐榜
  • 2026年24小时自助棋牌室加盟品牌综合实力评估 - 2026年企业推荐榜
  • 2026年靠谱的二轴破碎机/破碎机厂家采购参考指南(必看) - 行业平台推荐
  • 2026年质量好的pe钢丝网骨架管/pe钢丝网骨架复合管高评价厂家推荐 - 行业平台推荐