news 2026/4/6 7:43:00

关于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/4/5 19:50:56

Python+Vue的基于大数据技术的电影推荐系统的设计与实现 Pycharm django flask

这里写目录标题项目介绍项目展示详细视频演示感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多的人技术栈文章下方名片联系我即可~解决的思路…

作者头像 李华
网站建设 2026/3/26 4:00:41

Cassandra CQL 完全指南:大数据查询语言详解

Cassandra CQL 完全指南&#xff1a;大数据查询语言详解 关键词&#xff1a;Cassandra、CQL、大数据查询、分布式数据库、数据建模、NoSQL、高并发存储 摘要&#xff1a;本文将带你从零开始认识 Cassandra 的查询语言 CQL&#xff08;Cassandra Query Language&#xff09;。我…

作者头像 李华
网站建设 2026/4/5 20:02:25

单相动态电压恢复器补偿电压凹陷或过电压研究附Simulink仿真

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

作者头像 李华
网站建设 2026/4/3 1:55:36

Compose笔记(六十六)--ModalNavigationDrawer

这一节主要了解一下Compose中的ModalNavigationDrawer,在Jetpack Compose开发中&#xff0c;ModalNavigationDrawer是一个用于实现模态导航抽屉的核心组件&#xff0c;它允许用户通过侧滑手势或点击菜单图标触发一个覆盖在主内容之上的抽屉菜单&#xff0c;提供页面切换、功能导…

作者头像 李华
网站建设 2026/4/5 14:27:17

反激变换器与Buck - boost电路:电力变换的奇妙世界

反激变换器 - Buck-boost电路 在电力电子领域&#xff0c;反激变换器和Buck - boost电路就像两颗璀璨的明星&#xff0c;各自闪耀着独特的光芒&#xff0c;为我们实现各种电源转换需求立下汗马功劳。今天咱们就一起深入这两个神奇电路的世界&#xff0c;探索它们的奥秘。 Buc…

作者头像 李华