C++——STL标准模板库——常用算法归纳

使用标准模板库提供的算法需要包含头文件:algorithm,其中包含了遍历、查找、排序、拷贝和替换等算法。当容器储存内置数据类型可使用STL提供函数对象,当容器储存自定义数据类型时需要自定义数据对象或者函数用于提供自定义数据类型的比较、计算、赋值等操作。

一、遍历算法

1、for_each(iterator begin,iterator end,Fun _func);

遍历[begin,end)区间内的元素,通过函数_func操作元素,例如输出、计算、重新赋值等;_func可以是函数指针,也可以是函数对象,只能是一元函数。返回_func。

2、transform

        重载1:transform(iterator begin,iterator end,iterator destbegin,_func);遍历[begin,end)区间内的元素,经过_func(函数对象或函数)处理后,复制到destbegin迭代器指向的容器,返回destbegin迭代器;_func是一元函数。

        重载2:transform(iterator begin1,iterator end1,iterator begin2,iterator destbegin,_func);遍历[begin1,end1)区间内的元素,通过_func函数与begin2后面的元素逐一处理,复制到destbegin迭代器指向的位置,返回destbegin迭代器;_func是二元函数。

int main() {vector<int> v1 = { 1,2,3,3,4,4,5 };vector<int> v2 = { 2,3,4,4,5,5,6 };vector<int> dest(v1.size());transform(v2.begin(), v2.end(), v1.begin(), dest.begin(), minus<int>());for (auto value : dest) {cout << value << " ";}return 0;
}

二、查找算法

1、查找指定元素

        find(iterator begin,iterator end,const T&value);超找[begin,end)区间内是否存在value,存在返回迭代器,不存在返回end。

2、查找第一个满足条件元素

        find_if(iterator begin,iterator end,_Pre _pred);查找[begin,end)区间内第一个满足函数_pred的元素,存在返回迭代器,不存在返回end。_pred是一元函数。

3、查找满足条件的相邻元素

        重载一:adjacent_find(iterator begin,iterator end);查找[begin,end)区间中第一个相邻并相等的元素,返回迭代器,没有的话返回end。

        重载二:adjacent_find(iterator begin,iterator end, Pre _pred);重载可提供为第三个参数提供一个二元谓词或者二元函数,用于判断相邻两个元素是否满足指定条件。返回第一个满足条件元素的迭代器。

class compare {
public:bool operator()(const int&a, const int&b) {return a > b;}
};
int main() {vector<int> v = { 1, 2, 3, 3, 4, 4, 5 };auto it = adjacent_find(v.begin(), v.end(), compare());cout << *it << endl;return 0;
}

4、二分查找

        重载1:bool binary_search(iterator begin,iterator end,const T&value); 查找递增区间[begin,end)内有没有value,返回bool类型。

        重载2:bool binary_search(iterator begin,iterator end,const T&value,greater<T>());查找递减区间[begin,end)内有没有value,返回bool类型。

int main() {vector<int> v1 = { 1,2,3,3,4,4,5 };cout << binary_search(v1.begin(), v1.end(), 3) << endl;sort(v1.begin(), v1.end(), greater<int>());cout << binary_search(v1.begin(), v1.end(), 6, greater<int>()) << endl;return 0;
}

二分查找适用于前面学过的每个容器的有序序列,需要保持查找函数排序类型和容器一致。

5、统计

        int count(iterator begin,iterator end,const T&value);统计value在区间[begin,end)内出现次数。

        int count_if(iterator begin,iterator end, Pred _pred);统计value在区间[begin,end)内满足_pred条件的元素个数

三、排序算法

1、sort(iterator begin,iterator end);对区间[begin,end)内元素进行默认递增排序。

      sort(iterator begin,iterator end,greater<T>());对区间[begin,end)内元素进行递减排序。

      对于自定义数据类型,需要自定义排序谓词。

2、random_shuffle(iterator begin,iterator end);  洗牌:随机排序。调用时需要设置一个随机种子,否则每次排序结果不变。

class print {
public:void operator()(const int&a) {cout << a << " ";}
};
int main() {vector<int> v1 = { 1,2,3,4,5 };srand((unsigned int)time(NULL));random_shuffle(v1.begin(), v1.end());for_each(v1.begin(), v1.end(), print());return 0;
}

3、merge(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);合并两个序列复制到dest迭代器指向的位置。需要注意的是dest所在容器需要先申请空间,否则合并失败。一般合并的两个序列是有序的。

4、reverse(iterator begin,iterator end); 翻转指定区间。

四、拷贝和替换算法

1、copy(iterator begin,iterator end,iterator dest);将[begin,end)复制到dest。dest所在容器需要先申请空间。

2、replace(iterator begin,iterator end,T& oldval,T& newval); 将[begin,end)内的oldval替换为newval。

3、replace_if(iterator begin,iterator end,Pred pred,T&newval);将[begin,end)内满足pred条件的元素替换为newval。

4、swap(Container& c1,Container& c2); 交换两个容器的内容,此交换函数可交换两个任意相同类型的变量。

五、算术生成算法

1、accumulate(iterator begin,iterator end,int cnt);  将[begin,end)内的元素,在cnt的基础上累加

2、fill(iterator begin,iterator end,const T&value);  将[begin,end)内填充为value

此两个算法需要包含头文件<numeric>

六、常用集合算法

1、求交集:iterator set_intersection(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);求两个有序集合的交集,复制到dest指向的新容器中,dest指向的容器需要先申请储存空间,一般为两个容器中较小的size。返回交集的结束迭代器。

2、求并集:iterator set_union(iterator begin1,iterator end1,iterator begin2,iterator end2;iterator dest);求两个有序集合的并集,复制到dest指向的新容器中,dest指向的容器需要先申请储存空间,大小为两个容器size之和。

3、求差集:iterator set_difference(iterator begin1,iterator end1,iterator begin2,iterator end2,iterator dest);求有序集合1[begin1,end1)相对于有序集合2[begin2,end2)的差集,也就是1中有2中没有的元素,储存到dest迭代器指向的容器。

此三个集合算法要求集合必须是有序的,dest容器也是有序的,默认递增。

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

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

相关文章

STM32MP135开发板助力电力行业,IEC61850协议移植笔记

1.概述 IEC61850是变电站自动化系统&#xff08;SAS&#xff09;中通信系统和分散能源&#xff08;DER&#xff09;管理的国际标准。它通过标准的实现&#xff0c;实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明&#xff0c;在电力和储能系…

go语言-用channel控制goroutine的退出

用channel控制goroutine的退出 本文简要介绍了&#xff0c;如何用channel控制goroutine的退出的基本方法 for-range主动停止goruitine package mainimport ("fmt""sync""time" )/* Go并发编程模型&#xff1a;主动停止goroutine 方法一&#…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort)&#xff1a; 代码详解&#xff1a; 冒泡排序的优化&#xff1a; 选择排序(SelectSort)&#xff1a; 代码详解&#xff1a; 插入排序&#xff08;InsertSort&#xff09;&#xff1a; 代码详解&#xff1a; 希尔排序(ShellSort)&#xff1a; 法一…

Java中的常用API

常用API Object类浅克隆与深克隆 ObjectsObjects中的equals 包装类StringBuilder和StringBufferStringBuilder是可变字符串对象StringBuffer线程安全案例![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/87649c20e6464113a42aee5f16f1ee22.png) StringJoiner Object…

关于ZYZ旋转和XYZ旋转

ZYZ旋转和XYZ旋转 概述1、XYZ旋转2、ZYZ旋转 概述 以下公式默认为右手坐标系&#xff1b;ZYZ通常可以避免死解情况&#xff0c;因此在六轴末端解算时常被用到&#xff1b;参考文章 1、XYZ旋转 XYZ旋转一般是绕固定轴旋转(外旋)&#xff0c;旋转矩阵的构成为&#xff1a;RzRy…

软考 系统分析师系列知识点之需求管理(3)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之需求管理&#xff08;2&#xff09; 所属章节&#xff1a; 第11章. 软件需求工程 第8节. 需求管理 11.8.4 需求跟踪 根据IEEE的定义&#xff0c;可跟踪性包含两个层面的含义&#xff1a;一个是开发过程的两个或多个产品之…

无广告iOS获取设备UDID 简单方便快捷

ps&#xff1a; 为啥不用蒲公英了&#xff0c;就是因为有广告了&#xff0c;获取个UDID还安装游戏&#xff0c;真恶心?&#xff0c;所以找了新的获取UDID都方法&#xff0c;网页直接获取就可以&#xff0c;不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

(1)cpu0简介

一、cpu0介绍 cpu032位架构16位通用寄存器&#xff0c;协处理器和其他特殊寄存器 &#xff08;1&#xff09;通用寄存器 全局指针寄存器&#xff1a;"Global Pointer register"&#xff08;全局指针寄存器&#xff09;是一个在某些处理器架构中存在的专用寄存器&…

单臂路由实验(思科)

一&#xff0c;实验目的 在路由器的一个接口上通过配置子接口的方式&#xff0c;实现相互隔离的不同vlan之间互通。 二&#xff0c;设备配置 Switch1 Switch>enable 全局模式 Switch#configure terminal 配置模式 Switch(config)#vlan 10 …

【leetcode】20. 有效的括号

有效的括号 题目链接 // 栈结构 typedef char valuetype; typedef struct {valuetype* arr;int top;int capacity; } Stack;void Init(Stack* stack);void Push(Stack* stack, valuetype value); void Pop(Stack* stack);valuetype Top(Stack* stack); int Size(Stack* stack…

嵌入式中C 语言中的三块技术难点

C 语言在嵌入式学习中是必备的知识&#xff0c;甚至大部分操作系统都要围绕 C 语言进行&#xff0c;而其中有三块技术难点&#xff0c;几乎是公认级别的“难啃的硬骨头”。 今天就来带你将这三块硬骨头细细拆解开来&#xff0c;一定让你看明白了。 0x01 指针 指针是公认最难理…

26元/月起!腾讯云一键自动搭建4核16G幻兽帕鲁服务器

腾讯云无需任何配置自动搭建幻兽帕鲁游戏联机服务器&#xff0c;游戏24小时在线&#xff0c;4核16G游戏联机服务器低至26元/月起&#xff0c;新手小白也能一键搭建属于自己的幻兽帕鲁游戏联机服务器&#xff01; 第一步&#xff1a;购买游戏联机服务器 购买入口&#xff1a;htt…

Django知识随笔

目录 1.如何再ajax中传输post数据&#xff1f; 2.在form表单中使用jquery序列化&#xff0c;input框过多。 1.如何再ajax中传输post数据&#xff1f; 在ajax传递的那个网址&#xff0c;会调用你路由的视图函数&#xff0c;在视图函数上面加一句 csrf_exempt 。写上之后会有提…

Android:RecyclerView跨行跨列的LayoutManager:Spannedgridlayoutmanager

前言&#xff1a; RecyclerView可以使用GridLayoutManager实现跨行&#xff0c;但是不能跨列&#xff1b;瀑布流布局可以跨列但是又不能跨行。原生自带的各个LayoutManager中并没有可以又跨行又能跨列的。网上搜寻了一番&#xff0c;找到了一个亲测可行好用的三方库&#xff1…

DL/T1578-2021电力线路多旋翼无人机巡检系

DL/T1578-2021电力线路多旋翼无人机巡检系 DL/T 1578—2021标准的发布和实施对于架空电力线路的巡检工作具有里程碑式的意义。它不仅填补了多旋翼无人机巡检系统在行业标准方面的空白&#xff0c;还为电力行业提供了一套完整、科学的测试和评估方法。这将有助于提高架空电力线…

大小相等的numpy数组运算及数组与标量的运算

1 大小相等的numpy数组运算及数组与标量的运算 不用编写循环即可对numpy数组执行批量运算&#xff0c;而用数组表达式代替循环的做法&#xff0c;称为numpy的矢量化(vectorization)。 1.1 大小相等的数组运算 描述 大小相等的数组指shape相等的数组。大小相等的数组之间的任…

使用apifox创建一个Mock Server Api 接口

安装 下载 Apifox - API 文档、调试、Mock、测试一体化协作平台。拥有接口文档管理、接口调试、Mock、自动化测试等功能&#xff0c;接口开发、测试、联调效率&#xff0c;提升 10 倍。最好用的接口文档管理工具&#xff0c;接口自动化测试工具。 创建mock api项目中使用 创建项…

Blob 和byte 转MultipartFile 类型

先导包 <dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.7</version> </dependency>Blob 转 MultipartFile 类型 /*** Blob 转 MultipartFile 类型* param blob Blob…

构建LLM辅助生物威胁制造预警系统 人类越发展获取的超能力越大,破坏力越大,威胁越大。我们需要什么样的预警系统?既克服威胁又具有超能力 安全基础

https://openai.com/research/building-an-early-warning-system-for-llm-aided-biological-threat-creation 人类越发展获取的超能力越大&#xff0c;破坏力就越大&#xff0c;威胁越大。 人工智能就是为了赋予人人都能有超能力&#xff0c;而一旦被恶意或无意使用又威胁到人…

生产问题排查系列——未知404状态接口请求

引言 我们的产品主打金融服务领域&#xff0c;以B端客户为我们的核心合作伙伴&#xff0c;然而&#xff0c;我们的服务最终将惠及C端消费者。在技术实现上&#xff0c;我们采用了公司自主研发的微服务框架&#xff0c;该框架基于SpringBoot&#xff0c;旨在提供高效、可靠的服…