news 2026/5/13 17:31:26

关于STL的知识:集合算法,你学会了吗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于STL的知识:集合算法,你学会了吗

本文是集合(set)上的算法,这里的“集合”一词是元素集合的一般含义,而不仅仅是std::set,这篇文章是STL学习资源的一部分,一次一点关于STL的知识。

前提:范围已排序。即这篇文章提到的所有算法都要求输入范围是排序的。同样,它们的输出范围(当存在时)也是排序的。

二、取两个集合的部分数据

STL具有4种互补算法,可以取2个给定集合的不同部分。它们有一种常见的原型形式,输入两个范围,输出一个范围:

代码语言:C++

自动换行

AI代码解释

template<typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator algo(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);

因此,对于两个排序集合A和B,可以这样调用:

代码语言:C++

自动换行

AI代码解释

algo(A.begin(), A.end(), B.begin(), B.end(), result);

result可以是vector上的std::back_inserter,也可以是任何其他输出迭代器。

假设有两个集合A和B。

2.1、std::set_difference

std::set_difference将在A中而不是B中的所有元素复制到result中。也可以称为取非(即NOT)。

示例:

展开

代码语言:C++

自动换行

AI代码解释

#include <algorithm> #include <iterator> #include <set> #include <vector> std::vector<int> A = {...} // sorted vector std::set<int> B = {...} // std::set is always sorted std::vector<int> results; std::set_difference(A.begin(), A.end(), B.begin(), B.end(), std::back_inserter(results));

2.2、std::set_intersection

std::set_intersection将既在A中也在B中的所有元素复制到result中。即交集。

2.3、std::set_union

std::set_union将A、B或两者中的所有元素复制到result中。对于同时存在于两者中的元素,将取A的版本(除非在B中出现的公共元素比在A中出现的多,在这种情况下,也取其在B中的附加版本)。

2.4、std::set_symmetric_difference

std::set_symmetric_difference只是简单地将在 A 中却不在 B 中的元素以及在 B 中却不在 A 中的元素复制到result中。

std::set_symmetric_difference是一个特别好的算法示例,虽然听起来很复杂,但它实际上非常容易理解,并且在日常编码中非常有用。这种情况在STL算法中经常发生。

三、比较两个集合

比较两个集合的算法不得不提到std::includes,因为它操作的是集合(即前面解释过的按顺序排列的元素集合)。

给定两个排序集合A和B,std::include检查B的所有元素是否也在A中。

函数原型:

代码语言:C++

自动换行

AI代码解释

template<typename InputIterator1, typename InputIterator2> bool std::includes(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 );

使用方式:

代码语言:C++

自动换行

AI代码解释

bool AincludesB = std::includes(A.begin(), A.end(), B.begin(), B.end());

四、合并两个集合

4.1、std::merge

std::merge用于将两个排序集合 合并为一个排序集合。函数原型:

代码语言:JavaScript

自动换行

AI代码解释

template<typename InputIterator1, typename InputIterator2, typename OutputIterator> OutputIterator merge(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result);

给定两个排序集合A和B,将A和B合并到从result开始的排序范围中。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 1:44:03

【ISP】暗角阴影校正-Radial Shading

一、镜头阴影 当镜头与sensor匹配&#xff0c;因为Sensor感光区的边缘区域接收的光强比中心区域小&#xff0c;所造成的中心和四角亮度不一致的现象。镜头本身就是一个凸透镜&#xff0c;由于凸透镜原理&#xff0c;中心的感光必然比周边多。 镜头阴影不利于后期的画面分析&a…

作者头像 李华
网站建设 2026/5/3 16:24:21

具身智能抢人大战:毕业一年,年薪300万元

“AI让真正的天才价值体现出来了”。 具身智能的竞技场上&#xff0c;一场围绕顶尖人才的争夺战已经打响&#xff0c;其激烈程度与薪酬数字&#xff0c;正不断突破人们的想象。 最新的信号来自字节跳动。不久前&#xff0c;其旗下火山引擎释放出一则招聘信息&#xff1a;为招…

作者头像 李华
网站建设 2026/5/5 7:10:31

电力系统短期负荷预测(附Python代码+数据+详细文章讲解)

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华
网站建设 2026/4/26 12:28:47

电容器内部区域的有限元方法(FEM)仿真研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华