c++提高篇——STL常用算法
STL常用算法
- 一、常用遍历算法
- 一、for_each 遍历容器
- 二、transform 搬运容器到另一个容器中
- 二、常用查找算法
- 一、find
- 二、find_if
- 三、adjacent_find
- 四、binary_search
- 五、count
- 六、count_if
- 三、常用排序算法
- 一、sort
- 二、random_shuffle
- 三、 merage
- 四、reverse
- 四、常用拷贝和替换算法
- 一、copy
- 二、replace
- 三、replace_if
- 四、swap
- 五、常用算术生成算法
- 一、accumulate
- 二、fill
- 六、常用集合算法
- 一、set_intersection
- 二、set_union
- 三、set_difference
一、常用遍历算法
算法主要是由头文件 组成。
是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、追历操作、复制、修改等等。
体积很小,只包括几个在序列上面进行简单数学运算的模板函数。
定义了—些模板类.用以声明函数对象。
一、for_each 遍历容器
样例如下,这也是我们在做项目中常用的一种算法:
//回调函数实现
void print1(int val)
{cout << val << " ";
}//仿函数实现
class print2
{
public:void operator()(int val){cout << val << " ";}
};void test08()
{vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);for_each(v.begin(), v.end(), print1);for_each(v.begin(), v.end(), print2());
}
二、transform 搬运容器到另一个容器中
transform( iterator beg1,iterator end1,iterator beg2,_func) ;
具体的案例如下:
//函数实现
void print1(int val)
{cout << val << " ";
}//仿函数实现
class Transform
{
public:int operator()(int val){return val;}
};void test08()
{vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);vector<int> v2;v2.resize(v.size());//目标容器需要提前开辟空间transform(v.begin(), v.end(), v2.begin(), Transform());for_each(v.begin(), v.end(), print1);
二、常用查找算法
下面为函数实现的接口:
find 查找元素
find_if 按条件查找元素
adjacent_find 查找相邻重复元素
binary _search 二分查找法
count 统计元素个数
count_if 按条件统计元素个数
一、find
查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()
函数原型:
find(iterator beg, iterator end, value);
按值查找元素,找到返回指定位位置迭代器,找不到返回结束迭代器位置
beg 开始迭代器
end结束迭代器
value查找的元素
案例一:
vector<int> v;v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);vector<int>::iterator pos = find(v.begin(), v.end(), 10);cout << *pos << endl;
案例二:
class Person
{
public:Person(string name, int age){this->M_Age = age;this->M_Name = name; }bool operator == (const Person & p){if (this->M_Name == p.M_Name && this->M_Age == p.M_Age){return true;}else{return false;}};string M_Name;int M_Age;};void test08()
{Person p1("张三", 10);Person p2("里斯", 20);Person p3("王五", 30);Person p4("找刘", 40);vector<Person> v;v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);vector<Person>::iterator pos = find(v.begin(), v.end(), p2);cout << (*pos).M_Age << endl;
}
二、find_if
find_if(iterator beg, iterator end,_pred);
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置beg 开始迭代器
end结束迭代器
_Pred函数或者谓词(返回bool类型的仿函数)
具体案例如下:
//创建一个人类
class Person
{
public:Person(string name, int age){this->M_Age = age;this->M_Name = name; }string M_Name;int M_Age;};//创建一个仿函数
class MyCompare
{
public:bool operator()(Person &p){return p.M_Age > 10; }
};void test08()
{//实例化人Person p1("张三", 10);Person p2("里斯", 20);Person p3("王五", 30);Person p4("找刘", 40);//放入容器vector<Person> v;v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);//查找符合条件的人vector<Person>::iterator pos = find_if(v.begin(), v.end(), MyCompare());//如果存在则打印if (pos != v.end()){cout << (*pos).M_Age << endl;} //不存在else{cout << "不存在" << endl;}
}
三、adjacent_find
查找相邻重复元素
adjacent_find(iterator beg, iterator end) ;
查找相邻重复元素,返回相邻元素的第一个位置的迭代器
beg开始迭代器
end结束迭代器
优于语法比较简单,这里就不在进行演示了。
四、binary_search
查找指定元素是否存在
bool binary_search(iterator beg, iterator end, value);
查找指定的元素,查到返回true否则false
beg开始迭代器
end结束迭代器
value查找的元素
**注意在无序序列中不可用!**如果序列是无序的,则结果未知。也许对也许错。
五、count
统计元素个数
count(iterator beg,iterator end, value);统计元素出现次数
beg 开始迭代器
end结束迭代器
value 统计的元素
注意在统计自定义数据类型时,要重载==号才可以进行对比,且在传参数的时候要用const类型的数据类型。
六、count_if
按条件统计元素个数
count_if(iterator beg,iterator end,_Pred);
beg开始迭代器
end结束迭代器
_Pred谓词
具体的语法与find_if相似,请参照上文
三、常用排序算法
sort 对容器内元素进行排序
random_shuffle 洗牌 指定范围内的元素随机调整次序
merge 容器元素合并,并存储到另一容器中
reverse 反转指定范围的元素
一、sort
对元素进行排序
sort(iterator beg, iterator end,_Pred ) ;
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置
beg开始迭代器
end 结束迭代器
_Pred 谓词
sort(v.begin(), v.end(), greaner<int>())
这里语法例子就不在列举,有兴趣的伙伴可以参考之前的内容: 第四部分
二、random_shuffle
洗牌: 指定范围内的元素随机调整次序
randomn_shuffle( iterator beg, iterator end);
beg开始迭代器
end 结束迭代器
样例过于简单就不再写样例,有兴趣的小伙伴可以自行练习。
注意在使用前要加一个随机数种子,才能实现每次运行都是随机的状态:
srand((unsigned int)time(NULL));
三、 merage
两个容器元素合并,并存储到另一个容器中
merge(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2客器2结束迭代器
dest目标容器开始迭代器
合并时两个容器必须是有序的,合并之后的序列仍然是有序的!
注意在合并之前要给目标容器提前开辟空间,否则会抛出异常!
vTarget.resize(v1.size() + v2.size());
四、reverse
将容器内元素进行反转
reverse(iterator beg,iterator end);
beg 开始迭代器
end结束迭代器
此函数过于简单就不在描述了
四、常用拷贝和替换算法
copy 容器内指定范围的元素拷贝到另一容器中
replace 将容器内指定范围的旧元素修改为新元素
replace_if 容器内指定范围满足条件的元素替换为新元素
swap 互换两个容器的元素
一、copy
copy (iterator beg,iterator end, iterator dest );
按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位詈
beg开始迭代器
end 结束迭代器
dest目标起始迭代器
注意在copy之前要给目标容器提前开辟空间,否则会抛出异常!
二、replace
replace(iterator beg,iterator end, old value,new value);
beg 开始迭代器
end结束迭代器
old value 旧元素
new value新元素
三、replace_if
将区间内满足条件的元素,替换成指定元察
replace_if(iterator beg,iterator end,_pred,new value);
beg 开始迭代器
end结束迭代器
_pred 谓词
new value替换的新元素
四、swap
互换两个容器的元素
Swap(container c1,container c2); 互换两个容器的元素
c1 容器1
c2 容器2
注意一定是同一个类型的容器进行交换,否则会抛出异常!
五、常用算术生成算法
算术生成算法属于小型算法,使用时包含的头文件为#include 算法简介:
accumulate 计算容器元素累计总和
fill 向容器中添加元素
一、accumulate
计算区间内容器元素累计总和
accumulate(iterator beg, iterator end , value);
beg开始迭代器
end结束迭代器
value 起始值:一般为零
二、fill
向容器中添加元素
fill(iterator beg, iterator end, value) ;
beg 开始迭代器
end结束迭代器
value填充的值
六、常用集合算法

set_intersection 求两个容器的交集
set_union 求两个容器的并集
set_difference 求两个容器的差集
一、set_intersection
set_intersection(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2容眙2结束迭代器
dest目标容器开始迭代器
注意:两个集合必须是有序序列!
特殊情况下,两个集合最大的交集是其中最小集合的全部。
v.reszie(min(v1.size(), v2.size()))
二、set_union
set_union(iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2容器2结束迭代器
dest目标容器开始迭代器
注意:两个集合必须是有序序列!
特殊情况下,两个集合最大的并集是两个集合之和。
set_union返回值既是并集中最后一个元素的位置
三、set_difference
set_difference( iterator beg1,iterator end1,iterator beg2,iterator end2,iterator dest);
beg1容器1开始迭代器
end1容器1结束迭代器
beg2容器2开始迭代器
end2容器2结束迭代器
dest目标容器开始迭代器
注意:两个集合必须是有序序列!
特殊情况下,两个集合最大的差集是两个集合最大的一个。
相关文章:
c++提高篇——STL常用算法
STL常用算法一、常用遍历算法一、for_each 遍历容器二、transform 搬运容器到另一个容器中二、常用查找算法一、find二、find_if三、adjacent_find四、binary_search五、count六、count_if三、常用排序算法一、sort二、random_shuffle三、 merage四、reverse四、常用拷贝和替换…...
Materials - DistanceField Nodes
以前的相关笔记,归档发布;距离场相关节点:DistanceToNearestSurface节点:求出传入的Position位置到最近的面的距离并输出,在没有Position输入的时候,默认值会直接使用World Position:Position的…...
【ARMv8 编程】ARMv8 指令集介绍
ARMv8 架构中引入的最重要的变化之一是增加了 64 位指令集。该指令集补充了现有的 32 位指令集架构。这种增加提供了对 64 位宽整数寄存器和数据操作的访问,以及使用 64 位长度的内存指针的能力。新指令被称为 A64,以 AArch64 执行状态执行。ARMv8 还包括…...
大数据之Phoenix基本介绍
文章目录前言一、Phoenix简介二、Phoenix入门(一)创建表语法(二)查看表信息(三)删除表(四)大小写问题前言 #博学谷IT学习技术支持# 上篇文章介绍了Phoenix环境搭建,点击…...
算法leetcode|38. 外观数列(多语言实现)
文章目录38. 外观数列:样例 1:样例 2:提示:分析:题解:rustgocpythonjava38. 外观数列: 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字…...
异步交互的关键——Ajax
文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2,axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML):异步的 Jav…...
Android自定义View实现打钩签到动画
效果图实现原理我们看实现的动画效果,其实是分为1. 绘制未选中状态图形(圆弧和对号)2. 绘制选中状态圆弧的旋转的动画3. 绘制选中状态圆弧向中心收缩铺满动画4. 绘制选中状态对号5. 绘制选中状态下圆的放大回弹动画6. 暴露接口接口回调传递选…...
python+pytest接口自动化(3)-接口测试一般流程及方法
首先我们要明确,通常所接口测试其实就属于功能测试,主要校验接口是否实现预定的功能,虽然有些情况下可能还需要对接口进行性能测试、安全性测试。在学习接口自动化测试之前,我们先来了解手工接口测试怎样进行。URL组成为了更好的理…...
《MySQL学习》 表中随机取记录的方式
一.初始化测试表 创建表 words CREATE TABLE words ( id int(11) NOT NULL AUTO_INCREMENT, word varchar(64) DEFAULT NULL, PRIMARY KEY (id)) ENGINEInnoDB;插入测试数据 create procedure idata()begin declare i int; set i 0; while i<10000 do insert into words…...
功率信号源有什么作用和功能呢
功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器,它具有高电压、大功率的特点,在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等,可以有效的帮助电子工程师解决驱动负载和放大功率的问题。功率信号源和功率放大器…...
一些cmake error fixed
建完虚拟环境后 运行 pip install . 出现报错,显示svox2安装出错,然后开始进入到svox2中进行手动编译和安装。 1. cmake svox2/csrc pybind11找不到 conda install pybind11用 pip install 在虚拟环境中安装不行,据说会安装到全局下… 2. c…...
CentOS 7安装Docker并使用tomcat测试
文章目录环境准备Docker安装安装tomcat环境准备 CentOS 7以上版本linux内核版本需要在3.10以上,可通过uname -r 查看系统内核。 Docker安装 检查docker安装源 yum list docker yum安装docker : yum install docker.x86_64 启动 docker : s…...
隐私计算头条周刊(2.20-2.26)
开放隐私计算收录于合集#企业动态45个#周刊合辑45个#政策聚焦38个#隐私计算92个#行业研究37个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播…...
安装kibana 报错/访问不了
安装kibana 报错1,elasticsearch.yaml 和kibana.yaml 配置问题2,elasticsearch 和kibana版本不一致3,索引问题1,elasticsearch.yaml 和kibana.yaml 配置问题 我的RPM安装的,配置文件都在/etc/ vim /etc/elasticsearc…...
【华为OD机试模拟题】用 C++ 实现 - 身高排序(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明身高排序题目输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:ht…...
MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU FLASH
MK60DX256VLQ10(256KB)MK60DN256VLQ10 Kinetis K60 MCU 32BIT 256KB FLASH 144LQFP【说明】Kinetis K6x MCU系列是一个可扩展的组合,具有不同级别的集成,提供丰富的模拟、通信、定时和控制外设套件,以适应广泛的需求。应用楼宇自动化控制器人…...
Prometheus 告警模块配置深度解析
本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置,也可以通过配置文件配置。命令行用来配置不可变的系统参数,配置文件用来定义限制规则用于通知路由和通知接收者。 Alertmana…...
《分布式技术原理与算法解析》学习笔记Day23
分布式数据复制 我们在进行分布式数据存储设计时,通常会考虑对数据进行备份,以提高数据的可用性和可靠性,“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术? 在分布式数据库系统中,通常会设置主备…...
毕业设计 基于51单片机的手机蓝牙控制8位LED灯亮灭设计
基于51单片机的手机蓝牙控制8位LED灯亮灭设计1、项目简介1.1 系统构成1.2 系统功能2、部分电路设计2.1 STC89C52单片机核心系统电路设计2.2 LED电路设计2.3 蓝牙模块电路设计3、部分代码展示3.1 定时器初始化以及中断处理3.2 串口初始化3.3 串口中断处理1、项目简介 选题指导&…...
一起Talk Android吧(第五百零八回:多层布局功能)
文章目录功能介绍使用方法示例代码各位看官们大家好,上一回中咱们说的例子是"图片滤镜ImageFilterView",这一回中咱们说的例子是" 多层布局功能"。闲话休提,言归正转, 让我们一起Talk Android吧!功能介绍 我…...
2026年IEEE TASE,基于不平衡与平衡竞争策略辅助的双种群优化算法+约束多目标优化,深度解析+性能实测
目录1.摘要2.CMOPs3.提出方法4.结果展示5.参考文献6.代码获取7.算法辅导应用定制读者交流1.摘要 针对具有复杂碎片化可行域约束多目标优化难题,本文提出一种基于不平衡与平衡竞争策略辅助的双种群算法(UBCSO),通过平衡种群的均匀…...
MediaCreationTool.bat:Windows部署自动化脚本封装架构深度解析
MediaCreationTool.bat:Windows部署自动化脚本封装架构深度解析 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat …...
SEM轮廓技术在22nm以下OPC建模中的创新应用
1. SEM轮廓技术在OPC建模中的革命性突破在22nm及以下节点的半导体制造工艺中,光学邻近效应校正(OPC)面临着前所未有的挑战。传统基于CD(临界尺寸)测量的建模方法在应对复杂2D结构时显得力不从心,特别是在处…...
别再只用流水灯了!用Arduino和74HC595驱动数码管/点阵屏的完整教程
从流水灯到智能显示:74HC595驱动数码管与点阵屏的实战指南 在创客社区里,74HC595移位寄存器几乎成了"流水灯"的代名词——无数入门教程用它来演示如何用少量IO口控制多颗LED。但当你真正需要构建一个电子钟、温湿度显示器或简易信息板时&#…...
终极指南:如何使用Gulf of Mexico轻松实现TCP/UDP网络通信
终极指南:如何使用Gulf of Mexico轻松实现TCP/UDP网络通信 【免费下载链接】GulfOfMexico perfect programming language 项目地址: https://gitcode.com/GitHub_Trending/dr/GulfOfMexico Gulf of Mexico(原DreamBerd)是一种创新的编…...
Android 14+ Gemini深度整合设置手册(2024官方未公开的12项关键开关)
更多请点击: https://intelliparadigm.com 第一章:Android 14 Gemini深度整合的底层架构概览 Android 14 引入了面向 AI 原生体验的系统级重构,其中 Gemini 模型不再以独立 APK 或云端 API 形式存在,而是通过 Project Starline 框…...
5分钟掌握Windows安装Android应用的终极方案
5分钟掌握Windows安装Android应用的终极方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行Android应用,却苦于复杂的…...
如何用OBS插件打造专业音乐直播?Tuna插件完整指南
如何用OBS插件打造专业音乐直播?Tuna插件完整指南 【免费下载链接】tuna Song information plugin for obs-studio 项目地址: https://gitcode.com/gh_mirrors/tuna1/tuna 想让你的OBS直播画面瞬间升级为专业音乐电台风格吗?Tuna插件正是你需要的…...
从夏普IGZO技术授权看显示面板产业的技术转移与战略博弈
1. 从一则旧闻看显示产业的全球棋局:技术、资本与生存的博弈2013年夏天,一则来自日本的消息在科技产业圈,特别是显示面板和半导体供应链领域,激起了不小的涟漪。全球知名的消费电子品牌夏普公司,宣布了一项与中国国有企…...
多目标跟踪(Multi-Object Tracking, MOT)中的核心算法介绍:卡尔曼滤波算法和匈牙利算法
卡尔曼滤波算法和匈牙利算法两者都是多目标跟踪(Multi-Object Tracking, MOT)中的核心算法,但解决的是完全不同的问题。简单来说: 卡尔曼滤波:负责“预测未来”和“修正当前”。它帮你推测目标下一刻会出现在哪里。匈…...
