C++:STL:常用算法(下):拷贝,算术,集合算法

news2025/1/11 13:59:59

一:常用拷贝和替换算法

学习目标:掌握常用的拷贝和替换算法

算法简介:

copy     // 容器内指定范围的元素拷贝到另一容器中

replace   // 将容器内指定范围的旧元素修改为新元素

replace_if     // 容器内指定范围满足条件的元素替换为新元素

swap   // 互换两个容器的元素

1.1 copy算法 

功能描述:容器内指定范围的元素拷贝到另一个容器中

函数原型:copy(iterator beg, iterator end, iterator dest)

按值查找,找到返回指定位置的迭代器,找不到返回结束位置的迭代器

beg:  开始迭代器

end:  结束迭代器

dest:  目标起始迭代器

#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;

class MyPrints
{
public:
	void operator()(int val) {
		cout << val << " ";
	}
};

void test() {
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i + 1);
	}

	vector<int> v2;
	v2.resize(v1.size());
	copy(v1.begin(), v1.end(), v2.begin());

	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;
}

int main() {
	test();
}

1.2:replace 算法 

功能描述:将容器内指定范围的旧元素修改为新元素

函数原型:replace(iterator beg, iterator end ,oldvalue, newvalue)

将区间内旧元素替换成新元素

beg:  开始迭代器

end: 结束迭代器

oldvalue : 旧元素

newvalue :  新元素

void test1() {
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	replace(v1.begin(), v1.end(), 20, 200);
	for_each(v1.begin(), v1.end(), MyPrints());
}

1.3:replace_if 

功能描述:将区间内满足条件的元素,替换成指定元素

函数原型: replace_if (iterator beg,  iterator end, _pred, newvalue)

按条件替换元素,满足条件的替换成指定元素

beg:   开始迭代器

end :  结束迭代器

_pred :  谓词

newvalue :  替换的新元素

void test2() {
	vector<int> v1;
	v1.push_back(10);
	v1.push_back(20);
	v1.push_back(30);
	v1.push_back(40);

	// 把大于20的数替换成 1000
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	replace_if(v1.begin(), v1.end(), Greater30(), 1000);
	for_each(v1.begin(), v1.end(), MyPrints());
}

1.4:swap算法 

功能描述: 互换两个容器的元素

函数原型: swap(container c1, container c2);

互换两个容器的元素

c1:  容器1

c2:  容器2

void test3() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 10);
	}
	cout << "交换前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());

	cout << "交换后:" << endl;
	swap(v1, v2);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;
}

二:常用算术生成算法 

学习目标:掌握常用的算术生成算法

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

算法简介:

accumulate  // 计算容器元素累计总和

fill    // 向容器中添加元素

void test4() {
	vector<int> v1;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
	}
	int a = accumulate(v1.begin(), v1.end(), 0);
	int b = accumulate(v1.begin(), v1.end(), 100);

	cout << a << " ";
	cout << b << endl;
}

2.2:fill 

功能描述:向容器中填充指定的元素

函数原型:fill (iterator beg,  iterator end , value);

向容器中填充元素

beg: 开始迭代器

end: 结束迭代器

value: 填充的值

void test5() {
	vector<int> v1;
	v1.resize(10);
	
	// 填充
	fill(v1.begin(), v1.end(), 100);
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
}

三:常用集合算法 

学习:掌握常用的集合算法

算法简介

set_intersection    // 求两个容器的交集

set_union   // 求两个容器的∪

set_difference  // 求两个容器的差集

3.1 :set_intersection 

功能描述:求两个容器的交集

函数原型:set_intersection(iterator beg1,iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的交集,注意:两个集合必须是有序序列

beg1 :  容器1开始迭代器

end1:   容器1结束迭代器

beg2:  容器2 开始迭代器

end2:   容器2 结束迭代器

dest:   目标容器开始迭代器

void test6() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 10);
	}
	cout << "求集合交集前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;

	cout << "求交集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器中最小的一个
	v3.resize(min(v1.size(), v2.size()));
	vector<int>::iterator end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	cout << endl;
}
void myPrint(int val)
{
	cout << val << " ";
}

void test6() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合交集前:" << endl;
	for_each(v1.begin(), v1.end(), MyPrints());
	cout << endl;
	for_each(v2.begin(), v2.end(), MyPrints());
	cout << endl;

	cout << "求交集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器中最小的一个
	v3.resize(min(v1.size(), v2.size()));
	vector<int>::iterator end = set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

3.2 :set_union

功能描述:求两个集合的并集

函数原型:set_union(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的∪,注意两个集合必须是有序序列

beg1:  容器1开始迭代器

end1:  容器1结束迭代器

void test7() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合并集前:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	cout << "求并集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器大小之和
	v3.resize(v1.size()+ v2.size());
	vector<int>::iterator end = set_union(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

3.3 : set_difference 

功能描述: 求两个集合的差集

函数原型: set_difference(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest)

求两个集合的差集,注意:两个集合必须是有序序列

beg1 :  容器1开始迭代器

end1:  容器1结束迭代器

beg2:   容器2开始迭代器

end2:   容器2结束迭代器

dest:   目标容器开始迭代器

在这里插入图片描述

void test8() {
	vector<int> v1;
	vector<int> v2;
	for (int i = 0; i < 10; i++)
	{
		v1.push_back(i);
		v2.push_back(i + 5);
	}
	cout << "求集合差集前:" << endl;
	for_each(v1.begin(), v1.end(), myPrint);
	cout << endl;
	for_each(v2.begin(), v2.end(), myPrint);
	cout << endl;

	cout << "求差集后:" << endl;
	vector<int> v3;
	// 容器大小为这两个容器大小之和
	v3.resize(max(v1.size(),v2.size()));

	// V1和V2差集
	vector<int>::iterator end = set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;

	// V2和V1差集
	end = set_difference(v2.begin(), v2.end(), v1.begin(), v1.end(), v3.begin());
	for_each(v3.begin(), end, myPrint);
	cout << endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023-01-04 Echarts学习笔记(三) Echarts的实际应用场景:在网页中插入Echarts的折线图,饼图和柱状图

文章目录零.准备和说明1.最终页面效果2.资源地址一.网页布局1.网页结构分析2.其他准备3.完整代码index.htmlcss/index.scss4.效果5.知识点(待补充)contentzoomz-index&::afterkeyframe二.插入Echarts图表零.准备和说明 1.最终页面效果 主要分为两个部分,一是先进行常规页面…

BeautifulSoup深入学习

BeautifulSoup深入学习 简介 BeautifulSoup是python的一个库&#xff0c;其提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱&#xff0c;通过解析文档为用户提供需要抓取的数据&#xff0c;因为简单&#xff0c;所以不需要多少代码就可…

使用Hog特征进行字母和数字的分类

目的&#xff1a;使用字母数字的二值图像&#xff0c;进行识别&#xff1a; 整体思路&#xff1a; 1&#xff09;对图像进行预处理&#xff1b; 对收集的单个字符进行二值化&#xff0c;进行数据均衡&#xff0c;并且将所有的字符图片直接resize为20*20&#xff08;有过进行…

Docker镜像如何上传阿里云

目录 1.前期准备 2.push(推)镜像 3.pull(拉)镜像 1.前期准备 1.注册阿里云账户 阿里云官方网站链接&#xff1a;https://dev.aliyun.com 2.登陆账户 3.配置Docker加速器 注&#xff1a;搜索“容器镜像服务” 4.创建镜像仓库的命名空间 例如&#xff1a;xnx 5.创建镜像仓库(创…

77、【字符串】leetcode ——151. 反转字符串中的单词(C++版本)

题目描述 原题链接&#xff1a;151. 反转字符串中的单词 解题思路 先预处理头部空格和中间多余空格&#xff1b;再将整体进行逆转。例如&#xff1a;the sky is blue —> eulb si yks eht&#xff1b;最后&#xff0c;分别对每个单词进行逆转&#xff0c;即可完成反转字符…

生产制造业订单管理软件如何做好订单变更管理?

生产制造企业&#xff0c;由于客户需求具有多样性和不确定性&#xff0c;客户订单的内容便会存在出现各种变更的可能&#xff0c;如数量、交期、更改具体参数等&#xff0c;提出变更订单&#xff0c;是很常见的现象。生产制造企业常见的订单变更需求1、PMC已经下完制令后&#…

户外运动耳机怎么选、五款最适合户外运动的耳机分享

对于运动爱好者来说&#xff0c;很多人都比较喜欢边听音乐边运动&#xff0c;音乐能够让运动起来更有激情&#xff0c;提升运动锻炼效果。那么到底什么耳机更适合户外运动呢&#xff1f;目前运动耳机在市面上有很多&#xff0c;但不是每一款都适合户外运动&#xff0c;自己找的…

7.Express模块基础用法

Express是做web服务器的&#xff0c;是一个第三方的包&#xff0c;官网 Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网 Express的部分用法与http模块类似 在我看来Express是一个轻量级的框架&#xff0c;如果用于做一些较复杂的业务会…

亚马逊、阿里国际、Shopee、Temu等跨境电商平台测评自养号经验分享

对于亚马逊、temu、阿里国际等平台商家来说&#xff0c;流量非常重要。商家需要想办法提高流量。卖家店铺没有流量怎么办&#xff1f; 获取流量的第一点:自然搜索 自然搜索流量的来源实际上是通过站点的优化来提高排名的效果。站点优化有很多维度&#xff0c;如选择合适的关键…

嵌入式工程师招聘要求有哪些?

现在有非常多的朋友会问嵌入式软件工程师在实际的招聘中都是什么样的标准与要求呢&#xff0c;对于这个问题空口无凭&#xff0c;我今天从招聘网站上找了一些典型的招聘案例。 一、嵌入式软件工程师 职位描述&#xff1a; 1、对需求进行分析评审&#xff0c;并输出开发计划&a…

基于Vue和SpringBoot的进销存管理系统的设计和实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

【阶段二】Python数据分析Pandas工具使用08篇:探索性数据分析:数据的描述:数据的分散趋势与数据的分布形态

本篇的思维导图: 数据的分散趋势 数据的分散趋势是用来刻画数值型变量偏离中心的程度,最为常用的分散趋势指标有标准差、极差、四分位差等。通过这些指标可以反映样本之间的差异大小,如果指标值越大,说明样本之间差异越明显,反之差异越小。 方差与标准差 …

阿里云产品专家陶炳哲:Java应用最佳实验

2022 年 9 月 28 日&#xff0c;阿里云用户组&#xff08;AUG&#xff09;第 11 期活动在深圳举办。活动现场&#xff0c;阿里云产品专家陶炳哲向参会企业分享了《Java 应用最佳实验》。本文根据演讲内容整理而成。 大家好&#xff0c;我是陶炳哲&#xff0c;是阿里云产品专家。…

React(coderwhy)- 02(函数组件)

React的组件化开发 组件化是一种分而治之的思想&#xff1a; 如果我们将一个页面中所有的处理逻辑全部放在一起&#xff0c;处理起来就会变得非常复杂&#xff0c;而且不利于后续的管理以及扩展。 但如果&#xff0c;我们讲一个页面拆分成一个个小的功能块&#xff0c;每个功能…

191:vue+openlayers 选择feature,固定按钮删除selected feature

第191个 点击查看专栏目录 本示例的目的是介绍如何在vue+openlayer中使用select来选择feature元素,通过按键来删除selected的feature。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共95行)相关API参考专栏目标…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的ROS(Robot Operating System)算法模型

给我推荐20个比较流行的ros算法模型 很好&#xff0c;下面是20个比较流行的ROS(Robot Operating System)算法模型&#xff1a; 便携式机器人操作系统(PR2) 全向轮操作系统(TurtleBot) 机器人操作系统(ROS)用于机器人操作 基于空间相对导航的机器人操作系统(SLAM) 自适应机器人…

全网惟一面向软件测试人员的Python基础教程-在Python中如何对列表进行增删改排序?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

IB成绩可以申请英国大学吗?

我们都知道ALEVEL课程是英国正统的高中课程&#xff0c;几乎被所有英国学校作为大学招收新生的入学课程。 那么&#xff0c;IB课程作为与ALEVEL课程一样享受极高国际知名度的课程&#xff0c;是否也能够申请英国大学呢&#xff1f;可以确定的告诉大家&#xff0c;用IB课程申请英…

高压放大器的组成部分有哪些(功率放大器的性能好坏)

虽然很多电子工程师经常使用高压放大器&#xff0c;但是对于高压功率放大器的组成和使用都不太清楚&#xff0c;下面来介绍一下高压放大器的组成部分以及如何验证功率放大器的性能好坏。 一、高压放大器的介绍 高压放大器是一种理想的功率放大器&#xff0c;可以放大交流和直流…

[C语言]和我一起来认识“整型在内存中的存储”

目录 1.整型类型中的成员 2.整型在内存中的存储 2.1原码&#xff0c;反码&#xff0c;补码 2.2整型在内存中以补码存放数据 2.3大小端 2.3.1大小端的介绍 2.3.2通过编程判别当前机器的字节序 1.整型类型中的成员 (unsigned为无符号类型&#xff0c;signed为有符号类型) 1.c…