STL算法(中)

news2024/9/22 5:04:57

常用排序算法

sort

功能描述:
对容器内元素进行排序
函数原型:
sort(iterator beg, iterator end, _Pred) ;
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// _Pred 谓词

sort属于开发中最常用的算法之一,需熟练掌握  

 代码实现

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
//sort(iterator beg, iterator end, _Pred); 第三个元素谓词可加不加,不加为默认 
using namespace std;
void print(int val){
	cout<<val<<" ";
}
//bool Greater20(int val,int val2)//再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和
count_if案例 
//{
//	return val>val2;
//}
void test01(){
	vector<int>v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	//利用sort进行升序
	sort(v.begin(),v.end());
	
	for_each(v.begin(),v.end(),print); 
	cout<<endl;
	
//	改变为降序
//	sort(v.begin(),v.end(),Greater20);
	sort(v.begin(),v.end(),greater<int>());//内建函数对象 
	 	for_each(v.begin(),v.end(),print);//逆向输出
		 //三种输出方法 
} 
int main()
{
	test01();
	system("pause");
}

再次证明普通函数完全可以替代仿函数,但是其类型要一样,具体参考for_each案例和count_if案例 

random_shuffle

功能描述:
洗牌 指定范围内的元素随机调整次序
函数原型:
random_shuffle(iterator beg, iterator end) ;
// 指定范围内的元素随机调整次序
// beg 开始迭代器
// end 结束迭代器

//利用洗牌算法打乱顺序
    random_shuffle(v.begin(),v.end());
    
    for_each(v.begin(),v.end(),print());

再加上随机种子实现乱序

代码实现

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
#include<ctime>
using namespace std;
class print{
	public:
	void operator()(int val){
		cout<<val<<" ";
	}
};


void test01(){
	vector<int>v;
	for(int i=0;i<10;i++){
		v.push_back(i);
	}
	//利用洗牌算法打乱顺序
	random_shuffle(v.begin(),v.end());
	
	for_each(v.begin(),v.end(),print());
	 
} 
int main()
{
	srand((unsigned int)time(NULL));//经典随机种子 
	test01();
	system("pause");
}
总结:random_shuffle洗牌算法比较实用,使用时记得加随机数种子

merge

功能描述:
两个容器元素合并,并存储到另一容器中
函数原型:
merge(iterator beg1, iterator end1, iterator beg2, iterator end2, iterator dest) ;
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的  合并后还是有序序列 
// beg1 容器 1 开始迭代器 // end1 容器 1 结束迭代器 // beg2 容器 2 开始迭代器 // end2 容器 2 结束迭代器 //dest 目标容器 开始 迭代器

代码实现

#include <iostream>
#include<vector>
#include<algorithm>
// 容器元素合并,并存储到另一容器中
// 注意: 两个容器必须是有序的
// beg1 容器1开始迭代器 // end1 容器1结束迭代器 // beg2 容器2开始迭代器 // end2 容器2结束迭代器 //
//dest 目标容器开始迭代器
//有意思是合并后还是有序序列 
using namespace std;
class print{
	public:
	void operator()(int val){
		cout<<val<<" ";
	}
};
void test01(){
	vector<int>v1;
	vector<int>v2;
	
	for(int i=0;i<10;i++){
		v1.push_back(i);
		v2.push_back(i+5);
	}
	
	//目标容器
	vector<int>vTarget;
	//此时要给目标容器分配空间
	vTarget.resize(v1.size()+v2.size()); 
	
	merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());
	
	for_each(vTarget.begin(),vTarget.end(),print()); 
} 
int main()
{
	test01();
	system("pause");
}

实现

如图所示   合并后还是有序序列 

reverse

功能描述:
将容器内元素进行反转
函数原型:
reverse(iterator beg, iterator end) ;
// 反转指定范围的元素
// beg 开始迭代器  //end  结束迭代器

代码实现 

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件

using namespace std;
class print{
	public:
	void operator()(int val){
		cout<<val<<" ";
	}
};
void test01(){
	vector<int>v;
	v.push_back(10);
	v.push_back(30);
	v.push_back(50);
	v.push_back(20);
	v.push_back(40);
	
	cout<<"反转前:"<<endl;
	for_each(v.begin(),v.end(),print());
	cout<<endl;
	cout<<"反转后:"<<endl;
	reverse(v.begin(),v.end());
	for_each(v.begin(),v.end(),print());	
} 
int main()
{
	test01();
	system("pause");
}

常用拷贝和替换算法

copy

vector<int>v2(v1);//也可以直接拷贝,不用算法赋空间   也可等号赋值   (具体见前面的容器总结)

功能描述:
容器内指定范围的元素拷贝到另一容器中
函数原型:
copy(iterator beg, iterator end, iterator dest) ;
// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
// beg 开始迭代器
// end 结束迭代器
// dest 目标起始迭代器

 

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件

using namespace std;
class print{
	public:
	void operator()(int val){
		cout<<val<<" ";
	}
};
void test01(){
	vector<int>v1;
	for(int i=0;i<10;i++){
		v1.push_back(i);
	}
//	vector<int>v2(v1);//也可以直接拷贝,不用算法   也可等号赋值 
	vector<int>v2;
	//设置内存空间 
	v2.resize(v1.size());
	
	copy(v1.begin(),v1.end(),v2.begin());
	for_each(v2.begin(),v2.end(),print());
	
} 
int main()
{
	test01();
	system("pause");
}

replace

功能描述:
将容器内指定范围的旧元素修改为新元素
函数原型:
replace(iterator beg, iterator end, oldvalue, newvalue) ;
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素

简单,没什么说的,直接放代码

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件

using namespace std;
class print{
	public:
		void operator()(int val){
			cout<<val<<" ";
		}
};
//replace(iterator beg, iterator end, oldvalue, newvalue);
// 将区间内旧元素 替换成 新元素
// beg 开始迭代器
// end 结束迭代器
// oldvalue 旧元素
// newvalue 新元素
void test01(){
	vector<int>v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(50);
	v.push_back(20);
	v.push_back(60);
	v.push_back(20);
	v.push_back(70);
	cout<<"替换前"<<endl;
	for_each(v.begin(),v.end(),print());
	cout<<endl;
	
	//将20替换成2000
	replace(v.begin(),v.end(),20,2000); 
	cout<<"替换后"<<endl;
	for_each(v.begin(),v.end(),print());
	cout<<endl;
} 
int main()
{
	test01();
	system("pause");
}

 

replace_if

功能描述 :
将区间内 满足条件 的元素,替换成指定元素
函数原型:
replace_if(iterator beg, iterator end, _pred, newvalue) ;
// 按条件替换元素,满足条件的替换成指定元素
// beg 开始迭代器
// end 结束迭代器
// _pred 谓词   (bool)
// newvalue 替换的新元素

 代码如下

#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件
using namespace std;
//谓词  返回bool类型
class Greater30{
	public:
		bool operator()(int val){
			return val>=30;
		}
};

class print//仿函数 
{
	public:
		void operator()(int val){
			cout<<val<<" ";
		}
};
void test01(){
	vector<int>v;
	v.push_back(20);
	v.push_back(30);
	v.push_back(20);
	v.push_back(50);
	v.push_back(20);
	v.push_back(60);
	v.push_back(20);
	v.push_back(70);
	cout<<"替换前"<<endl;
	for_each(v.begin(),v.end(),print());
	cout<<endl;
	
	//将大于等于30替换为3000
	replace_if(v.begin(),v.end(),Greater30(),3000);//34为替换条件和替换值	
	for_each(v.begin(),v.end(),print());
	cout<<endl;
	
} 
int main()
{
	test01();
	system("pause");
}

swap

功能描述:
互换两个容器的元素
函数原型:
swap(container c1, container c2) ;
// 互换两个容器的元素
// c1 容器 1
// c2 容器 2
直接写两个容器
代码如下
#include <iostream>
#include<vector>
#include<algorithm>//算法 头文件

using namespace std;
void print(int val){
	cout<<val<<" ";
}
void test01(){
	vector<int>v1;
	vector<int>v2;
	
	for(int i=0;i<10;i++){
	v1.push_back(i);
	v2.push_back(i+100);	
	} 
	
	cout<<"交换前:"<<endl;
	for_each(v1.begin(),v1.end(),print);
	cout<<endl;
	for_each(v2.begin(),v2.end(),print);
	cout<<endl;
	cout<<"-----------------------------------"<<endl;
	cout<<"交换后:"<<endl;
	swap(v1,v2);
	for_each(v1.begin(),v1.end(),print);
	cout<<endl;
	for_each(v2.begin(),v2.end(),print);
	cout<<endl;
}
int main()
{
	test01();
	system("pause");
}

 

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

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

相关文章

1-3 mininet中使用python API直接拓扑定义以及启动方式对比

作为SDN网络中搭建拓扑非常重要的仿真平台&#xff0c;我们可以使用mininet默认的库内拓扑文件&#xff0c;也可以使用python语言进行自定义拓扑。使用python进行拓扑定义时&#xff0c;不同的定义方式将导致其启动的方式由所不同。 一、采用最原始的命令启动方式&#xff1a; …

Redis——事件

Redis服务器是一个事件驱动程序&#xff0c;服务器需要处理以下两种事件&#xff1a; 文件事件(file event)&#xff1a;Redis服务器通过套接字与客户端(或者其他Redis服务器)进行连接&#xff0c;而文件事件就是服务器对套接字操作的抽象(linux下一切皆文件&#xff0c;返回的…

TP框架 之think-auth权限认证

一、安装think-auth composer require 5ini99/think-auth二、数据表 -- ---------------------------- -- think_auth_rule&#xff0c;规则表&#xff0c; -- id:主键&#xff0c;name&#xff1a;规则唯一标识, title&#xff1a;规则中文名称 status 状态&#xff1a;为1正常…

【日志记录】——单片机可执行文件合并

一&#xff1a;需求场景 现在有一片单片机&#xff0c;执行程序包括自定义boot和应用程序app, 在将打包好的固件给到生产时有以下问题&#xff0c;由于要通过jlink烧录boot&#xff0c;然后上电启动boot&#xff0c;通过boot烧录初始化程序&#xff0c;过程过于复杂&#xff0…

基于ESP-WROOM-32的双串口通信并显示到OLED显示屏上

目录 开发板引脚图 Arduino环境配置1.ESP32开发版下载2.Arduino开发板选择 -> ESP32 Dev Module3.安装驱动库 接线图Arduino代码现象演示 开发板 ESP-WROOM-32 引脚图 Arduino环境配置 1.ESP32开发版下载 选择 esp32 by Espressif Systems 2.Arduino开发板选择 -> E…

一文读懂「四大主流计算芯片 CPU、GPU、ASIC、FPGA」特点和场景

纵观人类历史&#xff0c;从结绳计数、木制计数到巴比伦的粘土板上的刻痕&#xff0c;再到中国古代的算盘&#xff0c;社会生产力的提高与当时所采用的计算工具密切相关。计算工具能力越强&#xff0c;就能大幅缩短人类解决复杂问题的时间&#xff0c;社会生产力水平自然就会越…

微信小程序解决华为手机保存图片到相册失败

1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…

RCS系统之:界面设计

RCS Floor Manager设计的主要目的&#xff1a; 实时监控机器人状态实时查看货架状态查看机器人任务状态查看捡货站的任务状态地图的状态信息其他元素&#xff0c;如打包机&#xff0c;机械臂的状态动态的编辑地图元素信息等等 有兴趣的可以留言一起交流下

[office] Excel2007在工作簿中创建区域名称 #职场发展#经验分享

Excel2007在工作簿中创建区域名称 Excel 提供了几种不同的方法来创建区域名称。但在开始之前&#xff0c;必须注意关于可接受内容的重要规则: 名称不能含有空格。可以用一个下划线字符来代替空格(如Annual Total ) 。 可以使用字母和数字的任意组合&#xff0c;但是名称必须以…

Redis + Lua 实现分布式限流器

文章目录 Redis Lua 限流实现1. 导入依赖2. 配置application.properties3. 配置RedisTemplate实例4. 定义限流类型枚举类5. 自定义注解6. 切面代码实现7. 控制层实现8. 测试 相比 Redis事务&#xff0c; Lua脚本的优点&#xff1a; 减少网络开销&#xff1a;使用Lua脚本&…

C++ STL精通之旅:向量、集合与映射等容器详解

目录 常用容器 顺序容器 向量vector 构造 尾接 & 尾删 中括号运算符 获取长度 清空 判空 改变长度 提前分配好空间 代码演示 运行结果 关联容器 集合set 构造 遍历 其他 代码演示 运行结果​编辑 映射map 常用方法 构造 遍历 其他 代码演示1​编…

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

PbootCMS采集插件使用教程

这篇Pboot采集教程教你使用PbootCMS采集插件&#xff0c;自动批量采集网页文章数据&#xff0c;并发布到PbootCMS系统&#xff0c;快速丰富网站的内容。 1. 下载并安装PbootCMS采集插件 1-1&#xff09;PbootCMS采集插件免费下载&#xff1a;Pboot采集插件-PbootCMS发布模块下…

「Mybatis实战五」:Mybatis核心文件详解 - MyBatis常用配置environments、properties

一、MyBatis核心配置文件层级关系 ​ 本文代码在 Mybatis初体验&#xff1a;一小时从入门到运行你的第一个应用 所构建的基础代码结构之上&#xff0c;进行修改。 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下&#xff1a; 二…

什么是大小端字节序存储?如何用代码判断当前的机器是大端字存储还是小端存储?

目录 什么是大端字节序存储与小端字节序存储 为什么会有大端和小端之分&#xff1f; 用代码判断当前机器是大端存储还是小端存储 什么是大端字节序存储与小端字节序存储 1.字节序&#xff1a;以字节为单位&#xff0c;讨论存储顺序 2.大端字节序存储&#xff1a;高位在低地…

C和C++面试--看的不多只看一篇

C和C面试 1. 语言基础1.1 C和C有什么区别&#xff1f;1.2 a和&a有什么区别&#xff1f;1.3 #define和const区别&#xff1f;&#xff08;编译阶段、安全性、内存占用等&#xff09;1.4 inline函数1.5 对于⼀个频繁使⽤的短⼩函数&#xff0c;应该使⽤什么来实现&#xff1f…

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 &#xff08;1&#xff09;清空&#xff08;初始化&#xff09;棋盘函数实现 &#xff08;2&#xff09;打印棋盘函数实现 &#xff08;3&#xff0…

【HTML】MDN

文章目录 一、html元素1.1 <a>1.2 <abbr>1.3 <address>1.4<area>1.5 <article>1.6 <aside>1.7 <audio>1.8 <b>1.9 <base>1.10<bdi>1.11 <bdo>1.12 <blockquote>1.13 <body>1.14 <br>1.15…

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…