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

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

以前的相关笔记&#xff0c;归档发布&#xff1b;距离场相关节点&#xff1a;DistanceToNearestSurface节点&#xff1a;求出传入的Position位置到最近的面的距离并输出&#xff0c;在没有Position输入的时候&#xff0c;默认值会直接使用World Position&#xff1a;Position的…...

【ARMv8 编程】ARMv8 指令集介绍

ARMv8 架构中引入的最重要的变化之一是增加了 64 位指令集。该指令集补充了现有的 32 位指令集架构。这种增加提供了对 64 位宽整数寄存器和数据操作的访问&#xff0c;以及使用 64 位长度的内存指针的能力。新指令被称为 A64&#xff0c;以 AArch64 执行状态执行。ARMv8 还包括…...

大数据之Phoenix基本介绍

文章目录前言一、Phoenix简介二、Phoenix入门&#xff08;一&#xff09;创建表语法&#xff08;二&#xff09;查看表信息&#xff08;三&#xff09;删除表&#xff08;四&#xff09;大小写问题前言 #博学谷IT学习技术支持# 上篇文章介绍了Phoenix环境搭建&#xff0c;点击…...

算法leetcode|38. 外观数列(多语言实现)

文章目录38. 外观数列&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a;分析&#xff1a;题解&#xff1a;rustgocpythonjava38. 外观数列&#xff1a; 给定一个正整数 n &#xff0c;输出外观数列的第 n 项。 「外观数列」是一个整数序列&#xff0c;从数字…...

异步交互的关键——Ajax

文章目录1,Ajax 概述1.1 作用1.2 同步和异步1.3 案例1.3.1 分析1.3.2 后端实现1.3.3 前端实现2&#xff0c;axios2.1 基本使用2.2 快速入门2.2.1 后端实现2.2.2 前端实现2.3 请求方法别名最后说一句1,Ajax 概述 AJAX (Asynchronous JavaScript And XML)&#xff1a;异步的 Jav…...

Android自定义View实现打钩签到动画

效果图实现原理我们看实现的动画效果&#xff0c;其实是分为1. 绘制未选中状态图形&#xff08;圆弧和对号&#xff09;2. 绘制选中状态圆弧的旋转的动画3. 绘制选中状态圆弧向中心收缩铺满动画4. 绘制选中状态对号5. 绘制选中状态下圆的放大回弹动画6. 暴露接口接口回调传递选…...

python+pytest接口自动化(3)-接口测试一般流程及方法

首先我们要明确&#xff0c;通常所接口测试其实就属于功能测试&#xff0c;主要校验接口是否实现预定的功能&#xff0c;虽然有些情况下可能还需要对接口进行性能测试、安全性测试。在学习接口自动化测试之前&#xff0c;我们先来了解手工接口测试怎样进行。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…...

功率信号源有什么作用和功能呢

功率信号源是指集信号发生器与功率放大器为一体的电子测量仪器&#xff0c;它具有高电压、大功率的特点&#xff0c;在电子实验室中能够帮助用来驱动压电陶瓷、换能器以及电磁线圈等&#xff0c;可以有效的帮助电子工程师解决驱动负载和放大功率的问题。功率信号源和功率放大器…...

一些cmake error fixed

建完虚拟环境后 运行 pip install . 出现报错&#xff0c;显示svox2安装出错&#xff0c;然后开始进入到svox2中进行手动编译和安装。 1. cmake svox2/csrc pybind11找不到 conda install pybind11用 pip install 在虚拟环境中安装不行&#xff0c;据说会安装到全局下… 2. c…...

CentOS 7安装Docker并使用tomcat测试

文章目录环境准备Docker安装安装tomcat环境准备 CentOS 7以上版本linux内核版本需要在3.10以上&#xff0c;可通过uname -r 查看系统内核。 Docker安装 检查docker安装源 yum list docker yum安装docker &#xff1a; yum install docker.x86_64 启动 docker &#xff1a; s…...

隐私计算头条周刊(2.20-2.26)

开放隐私计算收录于合集#企业动态45个#周刊合辑45个#政策聚焦38个#隐私计算92个#行业研究37个开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神&#xff0c;专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播…...

安装kibana 报错/访问不了

安装kibana 报错1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题2&#xff0c;elasticsearch 和kibana版本不一致3&#xff0c;索引问题1&#xff0c;elasticsearch.yaml 和kibana.yaml 配置问题 我的RPM安装的&#xff0c;配置文件都在/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系列是一个可扩展的组合&#xff0c;具有不同级别的集成&#xff0c;提供丰富的模拟、通信、定时和控制外设套件&#xff0c;以适应广泛的需求。应用楼宇自动化控制器人…...

Prometheus 告警模块配置深度解析

本文您将了解到Prometheus 告警模块Alertmanager 配置的深度解析 Alertmanager 配置解析 Alertmanager 配置可以用命令行配置&#xff0c;也可以通过配置文件配置。命令行用来配置不可变的系统参数&#xff0c;配置文件用来定义限制规则用于通知路由和通知接收者。 Alertmana…...

《分布式技术原理与算法解析》学习笔记Day23

分布式数据复制 我们在进行分布式数据存储设计时&#xff0c;通常会考虑对数据进行备份&#xff0c;以提高数据的可用性和可靠性&#xff0c;“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术&#xff1f; 在分布式数据库系统中&#xff0c;通常会设置主备…...

毕业设计 基于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吧(第五百零八回:多层布局功能)

文章目录功能介绍使用方法示例代码各位看官们大家好&#xff0c;上一回中咱们说的例子是"图片滤镜ImageFilterView",这一回中咱们说的例子是" 多层布局功能"。闲话休提&#xff0c;言归正转&#xff0c; 让我们一起Talk Android吧&#xff01;功能介绍 我…...

丁小喜の兵器谱(学生管理系统)

我的第一个独立看需求完成项目&#xff0c;虽然很简单&#xff08;笑&#xff09;建立一个可以增加&#xff0c;修改&#xff0c;删除&#xff0c;展示学生信息的系统首先是一个界面&#xff0c;让你决定进行哪个操作1.2.3.4.5分别对应不同的操作&#xff0c;switch与这一操作完…...

linux:字符串拷贝的五种方法:使用指针下标,指针变量加偏移量,指针变量自加等

字符串数组名做函数形参&#xff0c;会退化正指针变量&#xff0c;需要使用指针变量操作字符串 代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <s…...

cesium常用方法汇集(工具篇)

1.Scene.prototype.pickPositionWorldCoordinates 根据屏幕坐标获取世界坐标 2&#xff0c;Scene.prototype.pickPosition 根据屏幕坐标获取世界坐标 3&#xff0c;Scene.prototype.drillPick 通过屏幕坐标拾取多个对象 4&#xff0c;Scene.prototype.pickFromRay 通过射线拾…...

分布式一致性与共识算法(一)

这里写目录标题是什么ACIDCAP组合一致性概念共识为什么需要共识算法会如何发展列举Paxos算法ZAB&#xff08;Zookeeper Atomic Broadcast&#xff09;协议Raft 算法参考引用是什么 从实现效果上来说&#xff0c;很多人或多或少都了解或者设计过具有强一致性的系统。但是&#…...

C++---最长上升子序列模型---怪盗基德的滑翔翼(每日一道算法2023.2.27)

注意事项&#xff1a; 本题为"线性dp—最长上升子序列的长度"的扩展题&#xff0c;所以dp思路这里就不再赘述。 题目&#xff1a; 怪盗基德是一个充满传奇色彩的怪盗&#xff0c;专门以珠宝为目标的超级盗窃犯。 而他最为突出的地方&#xff0c;就是他每次都能逃脱中…...

Python 之 Pandas 文件操作和读取 CSV 参数详解

文章目录一、Pandas 读取文件二、CSV 文件读取1. 基本参数2. 通用解析参数3. 空值处理相关参数4. 时间处理相关参数5. 分块读入相关参数一、Pandas 读取文件 当使用 Pandas 做数据分析的时&#xff0c;需要读取事先准备好的数据集&#xff0c;这是做数据分析的第一步。Panda 提…...

微服务的异步通信技术RabbitMQ

文章目录前言1.WorkQueue&#xff08;工作队列&#xff09;消息预取机制2.Publish&Subscribe&#xff08;发布-订阅&#xff09;1.Fanout&#xff08;广播&#xff09;2.DirectExchange&#xff08;路由&#xff09;3.TopicExchange&#xff08;话题&#xff09;MQ的优点前…...

Word处理控件Aspose.Words功能演示:使用 C++ 在 Word (DOC/DOCX) 中添加或删除水印

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…...

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年&#xff0c;自然语言处理 NLP 领域也步入了 LLM 时代&#xff0c;谷歌出品的 Bert 模型横空出世&#xff0c;碾压了以往的所有模型&#xff0c;直接在各种NLP的建模…...

四、阻塞队列

文章目录基础概念生产者消费者概念JUC阻塞队列的存取方法ArrayBlockingQueueArrayBlockingQueue的基本使用生产者方法实现原理ArrayBlockingQueue的常见属性add方法实现offer方法实现offer(time,unit)方法put方法消费者方法实现原理remove方法poll方法poll(time,unit)方法take方…...

上海做网站的公司有哪些/免费的电脑优化软件

上篇博客分析了当下游服务出故障&#xff0c;导致服务雪崩的情况&#xff0c;然后准备引入Sentinel组件来做容错。 Sentinel是什么&#xff1f; Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案。它以流量 为切入点, 从流量控制、熔断降级、系…...

做任务领黄钻的网站/网络运营培训

删除逻辑 boolean del(taskName任务名称, busNo业务编号) keyqlscf_taskName_busNo 如果key存在 getRedisTemplate().delete(key) 获取逻辑 boolean get(taskName任务名称, busNo业务编号) keyqlscf_taskName_busNo 如果key存在 取出redis中key对应的value&#xff1a;getRe…...

青岛做网站的/广告主平台

CSS 四1.内填充(margin)和外边距(padding)2.清除浮动3.盒子模型4.padding&#xff08;内填充&#xff09;5.margin外边距6.margin塌陷现象7.margin居中8.margin和padding遇见的一些问题1.内填充(margin)和外边距(padding) 1.body标签默认有margin的属性。 2.在CSS代码的第一步…...

加盟餐饮网站建设/外贸网站哪个比较好

1、修改数据库字符编码 mysql> alter database mydb character set utf8 ; 2、创建数据库时&#xff0c;指定数据库的字符编码 mysql> create database mydb character set utf8 ; 3、查看mysql数据库的字符编码 mysql> show variables like character%; //查询当前my…...

网站上面的彩票快3怎么做/在线外链发布工具

工作步骤&#xff1a;下载内核源码和相关的软件包&#xff1b;把ipvs补丁Patch到内核源码中&#xff1b;重新编译支持ipvs的内核&#xff1b;启用新内核&#xff1b;安装ipvs管理工具ipvsadm&#xff1b;配置LVS,构建负载均衡集群。 (1) 下载安装所需组件&#xff1a; 标准内…...

巴中网站建设天仁云/友情链接网

赵哥以前做过gg修改器用的全图传送文件&#xff0c;但是由于修改器的数据更新&#xff0c;代码的更新&#xff0c;那个文件已经失效了&#xff0c;所以赵哥对该文件进行了更新&#xff0c;现在已经可以使用了。具体使用教程看赵哥以前发的gg修改器使用教程。打开修改器点击最右…...