STL容器[28]交集、并集、差集

本文详细介绍了STL集合操作中的交集、并集、差集和对称差集算法,包括使用方法和注意事项。通过示例程序,展示了如何在C++中应用这些集合运算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://www.cnblogs.com/motadou/archive/2009/12/21/1629270.html

STL对集合操作有标准的算法,有没有用过呢?使用它们的时候有需要注意什么?例子程序?如果没接触过,请看这里的简单介绍:交集set_intersection、并集set_union、差集set_difference、对称差集set_symeetric_difference。 

针对这里提及的四个集合运算必须特别注意:
1、第一个算法需保证第一集合和第二集合有序,并从小到大排序,内部使用默认“<”操作符比较元素大小;
2、第二个算法需保证第一集合和第二集合有序,排序方式参照Compare确定,内部使用Compare比较元素大小。

1 -- set_intersection(交集)
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的交集为{3,7}。
函数返回值:结果集合的结束位置迭代器。
参数:第一个集合的开始位置,第一个集合的结束位置,第二个参数的开始位置,第二个参数的结束位置,结果集合的插入迭代器。对于第二个算法,Compare指定用于比较元素大小的仿函数。

2 -- set_union(并集)
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp);
该函数用于求两个集合的交集,结果集合中包含所有同时属于第一个集合和第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的并集为{1,2,3,4,5,7}。

3 -- set_difference(差集)
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result);
template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
OutputIterator result, Compare comp)
该函数用于求两个集合的差集,结果集合中包含所有属于第一个集合但不属于第二个集合的元素。例如:集合{1,2,3,7,9}和{3,4,5,7}的差集为{1,2,9}。

4 -- set_symeetric_difference(对称差集)
template<class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_symmetric_difference(InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result);
template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
OutputIterator set_symmetric_difference(InputIterator1 first1,
InputIterator1 last1,
InputIterator2 first2,
InputIterator2 last2,
OutputIterator result, Compare comp);
数学上,两个集合的对称差集是只属于其中一个集合,而不属于另一个集合的元素组成的集合。也就是说对称差集是去除同时出现在两个集合中的元素后,两集合其他元素组成的集合。例如:集合{1,2,3,7,9}和{3,4,5,7}的对称差为{1,2,4,5,9}。集合论中的这个运算相当于布尔逻辑中的异或运算。集合A和B的对称差通常表示为AΔB。

5 -- 交集、合集、差集、对称差集使用方法
#include 
#include 
template
void print_vector(const std::string & s_name, const std::vector & vec)
{
typedef typename std::vector::size_type size_type;
std::cout << s_name << ": ";
for (size_type i = 0; i < vec.size(); i++)
std::cout << vec[i] << (i == vec.size() - 1?"\n":",");
}
int main()
{
int a[] = {1,2,3,7,9};
std::vector v_less_1(a, a + 5);
int b[] = {3,4,5,7};
std::vector v_less_2(b, b + 4);
std::vector vr_less;
std::set_intersection(v_less_1.begin(), v_less_1.end(), v_less_2.begin(), v_less_2.end(),
std::insert_iterator<std::vector >(v_less, v_less.begin()));
print_vector("v_less", v_less);
std::vector vr_less;
std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::insert_iterator<std::vector >(v_less, v_less.begin()), std::less());
print_vector("v_less", v_less);
std::vector v_greater;
std::set_difference(v1.begin(), v1.end(), v2.begin(), v2.end(), std::insert_iterator<std::vector >(v_greater, v_greater.begin()), std::greater());
print_vector("v_greater", v_greater);
return 0;
}

### C++ 中实现区间交集差集的操作 在 C++ 中,可以利用标准模板库 (STL) 提供的功能来高效地处理合之间的基本运算。对于有序序列 `a` 和 `b` 的交集以及差集操作,可以通过调用 STL 函数 `set_intersection`, `set_union` 及 `set_difference` 来完成。 #### 操作 为了计算两个容器,即获取所有属于任一输入容器中的元素组成的合: ```cpp #include <algorithm> #include <vector> #include <iterator> // 假设 a 和 b 是已经排序好的 vector<int> 类型的对象 std::vector<int> result; result.clear(); std::set_union(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); ``` 这段代码会将 `a` 和 `b` 合后的结果存入 `result` 容器中[^1]。 #### 交集操作 当目标是从两个已排序的容器中找出共同拥有的元素时,则应采用如下方式构建它们的交集: ```cpp result.clear(); std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); ``` 此段程序执行完毕之后,变量 `result` 将仅包含那些既存在于 `a` 又存在於 `b` 内部的数据项。 #### 差集操作 如果意图得到的是第一个容器中有而第二个容器里没有出现过的元素列表的话,那么应该这样写: ```cpp result.clear(); std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result)); ``` 上述命令能够帮助筛选出只出现在 `a` 而不在 `b` 当中的成员,将其追加到 `result` 结果中。 值得注意的一点是,在应用这些算法之前,确保参与比较的两组数据均已按照升序排列;否则可能会导致错误的结果或者未定义行为的发生。此外,由于这里使用的都是基于迭代器的方法论,因此适用于任何实现了随机访问特性的容器类型,比如 `std::vector` 或者 `std::deque` 等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值