【C++】22___STL常用算法
目录
一、常用遍历算法
二、常用查找算法
2.1 find
2.2 其它查找算法
三、常用排序算法
3.1 sort
3.2 其它排序算法
四、拷贝 & 替换
4.1 copy
4.2 其它算法
五、常用的算数生成算法
5.1 accumulate
5.2 fill
六、常用集合算法
6.1 set_intersection
6.2 其它算法
概述:
- 算法主要是由头文件<algorithm> 、<functional> 、<numeric>组成
- <algorithm>是所有SSTL头文件中最大的一个,范围涉及到比较、交换、查找等等。
- <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
- <functional>定义了一些模板类,用以声明函数对象
一、常用遍历算法
- for_each() //遍历容器
- transform //搬运容器到另一个容器中
for_each()代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print1(int var){cout<<var<<" ";
}class print2{
public:void operator()(int var){cout<<var<<" ";}
};void test(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}for_each(v.begin() , v.end() , print1);cout<<endl;for_each(v.begin() , v.end() , print2());cout<<endl;
}int main(){test();return 0;
}
transform代码示例
函数原型:
- transform(iterator beg1 , iterator end1 , iterator beg2 , _func);
- //beg1源容器开始迭代器
- //end1源容器结束迭代器
- //beg2目标容器开始迭代器
- //_func 函数或者函数对象
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>class re{
public:int operator()(int var){return var;}
};class print{
public:void operator()(int var){cout<<var<<" ";}
};void test(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}vector<int>v2;v2.resize(v1.size());transform(v1.begin() , v1.end() , v2.begin() ,re());for_each(v2.begin() , v2.end() , print());}int main(){test();return 0;
}
二、常用查找算法
简介:
- find //查找元素
- find_if //按条件查找元素
- adjacent_find //查找相邻重复元素
- binary_search //二分查找法
- count //统计元素个数
- count_if //按条件统计元素个数
2.1 find
函数原型:
- find(interator beg , iterator end , value);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>class person{
public:person(string name , int age){this->m_Name = name;this->m_Age = age;}bool operator==(const person&p){if(this->m_Name == p.m_Name && this->m_Age == p.m_Age){return true;}else{return false;}}
public:string m_Name;int m_Age;
};void test1(){vector<int>v1;for(int i=0;i<10;i++){v1.push_back(i);}vector<int>::iterator it = find(v1.begin() , v1.end() , 4);if(it != v1.end()){cout<<"找到了:"<<*it<<endl;}else{cout<<"没找到"<<endl;}
}void test2(){vector<person>v2;person p1("a",18);person p2("b",19);person p3("c",20);person p4("d",21);v2.push_back(p1);v2.push_back(p2);v2.push_back(p3);v2.push_back(p4);person pp("c",20);vector<person>::iterator it = find(v2.begin() , v2.end() , pp);if(it == v2.end()){cout<<"没找到"<<endl;}else{cout<<"找到了:"<<it->m_Name<<" "<<it->m_Age<<endl;}
}int main(){test1();test2();return 0;
}
2.2 其它查找算法
按条件查找:find_if
- find_if(iterator beg , iterator end , _Pred); //按值查找元素,找到返回指定位置迭代器;找不到返回结束迭代器位置。
查找相邻重复元素:adjacent_find
- adjacent_find(iterator beg , iterator end); //查找相邻重复元素,返回相邻元素的第一个位置的迭代器。
查找指定元素是否存在:binary_search
- bool binary_search(iterator beg , iterator eng , value); //查找指定的元素,查到返回true、否则返回false。 注:在无序序列中不可用
统计元素个数:count
- count(iterator beg , iterator end , value); //统计元素出现次数
按条件统计元素个数:count_if
- count_if(iterator beg , iterator end , _Pred); //按条件统计元素个数
三、常用排序算法
简介:
- sort //对容器内元素进行排序
- random_shuffle //指定范围内的元素随机调整次序
- merge //容器元素合并,并存储到另一个容器中
- reverse //反转指定范围的元素
3.1 sort
函数原型:
- sort(iterator beg , iterator end , _Pred);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.push_back(10);v.push_back(50);v.push_back(20);v.push_back(30);v.push_back(40);sort(v.begin() , v.end() );//默认升序for_each(v.begin() , v.end() , print);sort(v.begin() , v.end() , greater<int>());//降序cout<<endl;for_each(v.begin() , v.end() , print);
}int main(){test();return 0;
}
3.2 其它排序算法
洗牌算法:random_shuffle
- random_shuffle(iterator beg , iterator end); //指定范围内的元素随机调整次序
两个容器合并,并存储到另一个容器中:merge
- merge(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest); //两个容器必须是有序的,且合并后仍是有序的
容器内元素进行反转:reverse
- reverse(iterator beg , iterator end);
四、拷贝 & 替换
简介:
- copy //容器内指定范围的元素拷贝到另一容器中
- replace //将容器内指定范围的旧元素修改为新元素
- replace_if //容器内指定范围满足条件的元素替换为新元素
- swap //互换两个容器的元素
4.1 copy
函数原型:
- copy(iterator beg , iterator end , iterator dest); //容器内指定范围的元素拷贝到另一容器中
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.push_back(12);v.push_back(13);v.push_back(14);vector<int>v2;v2.resize(v.size());copy(v.begin() , v.end() , v2.begin());for_each(v2.begin() , v2.end() , print);cout<<endl;
}int main(){test();return 0;
}
4.2 其它算法
将容器内指定范围的旧元素修改为新元素:replace
- replace(iterator beg , iterator end , oldvalue , newvalue);
将区间满足条件元素替换为指定元素:replace_if
- replace_if(iterator beg , iterator end , _pred , newvalue);
互换两个容器的元素:swap
- swap(container c1 , container c2);
五、常用的算数生成算法
算法简介:
- accumulate //计算容器元素累计总和
- fill //向容器中添加元素
5.1 accumulate
函数原型:
- accumulate(iterator beg , iterator end , value); //需包含头文件#include<numeric> , 参数三为起始的累加值
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<numeric>void test(){vector<int>v;for(int i=0;i<10;i++){v.push_back(i);}int num = accumulate(v.begin() , v.end() , 0);cout<<num<<endl;
}int main(){test();return 0;
}
5.2 fill
函数原型:
- fill(iterator beg , iterator end , value);
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v;v.resize(10);fill(v.begin() , v.end() , 100);for_each(v.begin() , v.end() , print);
}int main(){test();return 0;
}
六、常用集合算法
算法简介:
- set_intersection //求两个容器的交集
- set_union //并集
- set_difference //差集
6.1 set_intersection
函数原型:
- set_intersection(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 求交集的两个集合必须为有序序列
- 目标容器开辟空间需要从两个容器中取最小值
代码示例
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>void print(int var){cout<<var<<" ";
}void test(){vector<int>v1;vector<int>v2;for(int i=0;i<10;i++){v1.push_back(i);v2.push_back(i+5);}vector<int>vT;vT.resize( min(v1.size() , v2.size()) );vector<int>::iterator END = set_intersection(v1.begin() , v1.end() , v2.begin() , v2.end() , vT.begin());for_each( vT.begin() , END , print);
}int main(){test();return 0;
}
6.2 其它算法
两集合的并集:set_union
- set_union(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 两个集合必须为有序序列
- 目标容器开辟空间需要两个容器相加
两集合的差集:set_difference
- set_difference(iterator beg1 , iterator end1 , iterator beg2 , iterator end2 , iterator dest);
- 返回目标容器最后一个元素的迭代器地址
- 两个集合必须为有序序列
- 目标容器开辟空间需要两个容器的较大值
相关文章:

【C++】22___STL常用算法
目录 一、常用遍历算法 二、常用查找算法 2.1 find 2.2 其它查找算法 三、常用排序算法 3.1 sort 3.2 其它排序算法 四、拷贝 & 替换 4.1 copy 4.2 其它算法 五、常用的算数生成算法 5.1 accumulate 5.2 fill 六、常用集合算法 6.1 set_intersection 6…...

意静明和-十成
十成 责任(健康)、使命(事业)、信念(意义)、自律(排诱)、自修(知识)、总结(四为)、执行(一事不拖)、人情&…...

easyui textbox使用placeholder无效
easyui textbox使用placeholder无效 在easyui 的textbox控件,请使用data-options 设定 示例 <input type text class easyui-textbox data-options "prompt:请输入您的邮箱"/>...

flux中的缓存
1. cache,onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存,但是当下游消费者的处理速度比上游生产者慢时,上游生产的数据会被暂时存储在缓冲区中,防止丢失。 2. Flux.range 默认…...

代码重定位详解
文章目录 一、段的概念以及重定位的引入1.1 问题的引入1.2 段的概念1.3 重定位 二、如何实现重定位2.1 程序中含有什么?2.2 谁来做重定位?2.3 怎么做重定位和清除BSS段?2.4 加载地址和链接地址的区别 三、散列文件使用与分析3.1 重定位的实质…...

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备
课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课,建立您需要的技能,以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动,学…...

从0到机器视觉工程师(一):机器视觉工业相机总结
目录 相机的作用 工业相机 工业相机的优点 工业相机的种类 工业相机知名品牌 光源与打光 打光方式 亮暗场照明 亮暗场照明的应用 亮暗场照明的区别 前向光漫射照明 背光照明 背光照明的原理 背光照明的应用 同轴光照明 同轴光照明的应用 总结 相机的作用 相机…...

Docker安装(Docker Engine安装)
一、Docker Engine和Desktop区别 Docker Engine 核心组件:Docker Engine是Docker的核心运行时引擎,负责构建、运行和管理容器。它包括守护进程(dockerd)、API和命令行工具客户端(docker)。适用环境&#…...

数组的深度监听deep
场景:组件提供的emit事件可能被占用,在不能使用事件提交的情况下,就要上watch数组监听了,但是是发现只有在数组的长度发生变化的时候才会触发监听,这怎么行。。。。。 对于对象数组的深度监听,如果没有正确…...

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定(升级版)
文章目录 1、updateInviteCodeStatus2、handleLock3、InviteCodeController4、InviteCodeService5、CrudRepository 点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定:https://blog.csdn.net/m0_65152767/article/details…...

UniApp 性能优化策略
一、引言 在当今数字化时代,移动应用的性能成为影响用户留存与满意度的关键因素。UniApp 作为一款热门的跨平台开发框架,以一套代码适配多端的特性极大提升了开发效率,但同时也面临着性能优化的挑战。优化 UniApp 性能,不仅能够让…...

【Linux报告】实训六 重置超级用户密码
实训六 重置超级用户密码 2018编写-今日公布 【练习一】忘记root密码 步骤一:开启或重启系统,并且要在五秒之内按任何键; 步骤二:按任意键,停止进入系统,按【e】键,跳转新页面,再…...

smolagents:一个用于构建代理的简单库
HF推出 smolagents,一个非常简单的库,它能够解锁语言模型的代理功能。以下是它的简要介绍: from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModelagent CodeAgent(tools[DuckDuckGoSearchTool()], modelHfApiModel())agent…...

通过Dockerfile来实现项目可以指定读取不同环境的yml包
通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…...

云手机 —— 手机矩阵的 “超级外挂
如何打造手机矩阵 打造手机矩阵主要包括以下几个步骤: 1.确定目标与需求:首先,明确打造手机矩阵的目的和需求,是为了进行电商运营、自媒体推广、任务管理还是其他目的。这将决定后续的手机数量、操作系统选择以及应用安装等。 2.选择手机与操作系统:根据…...

OpenCV的TickMeter计时类
OpenCV的TickMeter计时类 1. TickMeter是一个计时的类1.1 计算耗时1.2 计算循环的平均耗时和FPS1.3 function 2. 案例 1. TickMeter是一个计时的类 https://docs.opencv.org/4.x/d9/d6f/classcv_1_1TickMeter.html#details 1.1 计算耗时 TickMeter tm;tm.start();// do some…...

蓝桥杯JAVA刷题--001
文章目录 题目需求2.代码3.总结 题目需求 2.代码 class Solution {public String convertDateToBinary(String date) {if (date null || date.length() ! 10 || date.charAt(4) ! - || date.charAt(7) ! -) {throw new IllegalArgumentException("输入的日期格式不正确&…...

免费又开源:企业级物联网平台的新选择 ThingsPanel
在开源领域,选择合适的开源协议是开发者和企业能否充分利用平台的关键。ThingsPanel,作为一个专注于物联网的开源平台,近日将协议从 AGPLv3 改为更开放的 Apache 2.0。这一改变对开发者和用户意味着什么? 为什么协议要从 AGPLv3 转…...

鸿蒙开发:文本合成语音
前言 Android开发的同学都知道,在Android当中,实现一段文字合成语音播放,可以使用系统提供的对象TextToSpeech来很快的实现,如果不用系统自带的,也可以使用三方提供的,比如讯飞的语音合成等等,总…...

雷军:科技传奇的逐梦之旅
亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、Java 与 Python 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在未来…...

LeetCode - 初级算法 数组(删除排序数组中的重复项)
免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…...

2024年度培训运维总结
目前带的弟子跟我实战训练运维的总就业率基本可以稳定在 100% 左右(因为我不带小白和没学历和大龄,悟性低都筛掉了还能找我说明条件够了) 以下是弟子私教训练营的最新就业数据(2024年12月25日): 面试辅导…...

java重装小结
一、Java安装 安装路径 https://www.oracle.com/java/technologies/javase/javas e8-archive-downloads.html 具体类型可参考: Java安装配置-CSDN博客 我在这一步主要碰到的问题就是访问官网报404错误,可参考: 在oracle官网下载资源显示…...

ubuntu20.04 中文输入法安装
中文输入法安装指南 在 Ubuntu 20.04 上安装中文输入法,您可以按照以下步骤操作: 打开终端。安装 fcitx 输入法框架和中文输入法模块:sudo apt update sudo apt install fcitx fcitx-pinyin安装中文语言支持:sudo apt install l…...

SQL常用语句(基础)大全
SQL语句的类型 1.DDL 1.库2.表 2.DML 1.插入数据 insert inot2.删除数据 delete / truncate3.修改数据 update set 3.DQL 1.无条件查询2.查询 什么开始 到什么结束3.指定条件查询 1.单个条件 ro in2.多个条件 and4.查询不为NULL值 is not null ,为NULL值 is null5.模糊查询 li…...

计算和可视化相对湿度结果
了解如何确定 CFD 模型中的相对湿度。 了解相对湿度 大气是干燥空气和水蒸气的混合物,每一种的压力之和等于蒸气压。相对湿度是指空气中的水分量与空气在特定温度下可以容纳的最大水分量之比。它通常以百分比表示。它的范围从 0(干燥空气)到…...

uniapp-vue3(下)
关联链接:uniapp-vue3(上) 文章目录 七、咸虾米壁纸项目实战7.1.咸虾米壁纸项目概述7.2.项目初始化公共目录和设计稿尺寸测量工具7.3.banner海报swiper轮播器7.4.使用swiper的纵向轮播做公告区域7.5.每日推荐滑动scroll-view布局7.6.组件具名…...

一起学习Firtran: Fortran中的流程控制与操作符
流程控制语句 在计算机编程中,控制程序流程是算法设计中的一个核心概念,它使得程序能够根据特定条件执行不同的操作或重复执行某段代码。这显著增强了计算机算法相对于简单数学公式的功能和灵活性。 if语句 在单个 if 语句中只有当测试表达式࿰…...

Sonic:开源Go语言开发的高性能博客平台
Sonic:一个用Go语言开发的高性能博客平台 简介 Sonic,一个以其速度如声速般快速而命名的博客平台,是一个用Go语言开发的高性能博客系统。正如其名字所暗示的,Sonic旨在提供一个简单而强大的博客解决方案。这个项目受到了Halo项目…...

SpringBoot教程(十四) SpringBoot之集成Redis
SpringBoot教程(十四) | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 (举例讲解)2.4 项目中使用之工具类封装 (正式用这个)2.5 序列化 &…...