算法set_intersection、set_union、set_difference

关于容器交集、并集、差集的算法

不喜欢无实物表演,秉承一贯风格,用代码说事。

1 示例代码

#include <set>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>
int main()
{
std::set<std::string> basket1{ "apple", "orange", "banana", "apricot", "peanut", "cherry" };
std::set<std::string> basket2{ "cherry", "pear", "mango", "grape", "lemon", "peanut" };
auto printSet = [](std::set<std::string>& strSet, const std::string& message) {
std::cout << "打印" << message << "结果如下:" << std::endl;
for (auto& item : strSet)
std::cout << item << std::endl;
std::cout << std::endl;
};
// 打印原始数据
printSet(basket1, "篮子1");
printSet(basket2, "篮子2");
// 交集
std::set<std::string> inter_result;
std::set_intersection(std::begin(basket1), std::end(basket1), std::begin(basket2), std::end(basket2),
std::inserter(inter_result, std::begin(inter_result)));
printSet(inter_result, std::string("set_intersection"));
// 并集
std::set<std::string> union_result;
std::set_union(std::begin(basket1), std::end(basket1), std::begin(basket2), std::end(basket2),
std::inserter(union_result, std::begin(union_result)));
printSet(union_result, "set_union");
// 差集
std::set<std::string> difference_result;
std::set_difference(std::begin(basket1), std::end(basket1), std::begin(basket2), std::end(basket2),
std::inserter(difference_result, std::begin(difference_result)));
printSet(difference_result, "set_difference");
// 非set容器应用示例
{
std::vector<int> vecInt1 = { 10, 20, 30, 40, 50, 60 };
std::vector<int> vecInt2 = { 20, 25, 30, 34, 56, 80 };
std::vector<int> inter_vec_result;
std::set_intersection(std::begin(vecInt1), std::end(vecInt1), std::begin(vecInt2), std::end(vecInt2),
std::back_inserter(inter_vec_result));
std::cout << "std::vector应用结果示例:" << std::endl;
for (auto& item : inter_vec_result)
{
std::cout << item << std::endl;
}
}
system("pause");
}

2 运行结果

打印篮子1结果如下:
apple
apricot
banana
cherry
orange
peanut
打印篮子2结果如下:
cherry
grape
lemon
mango
peanut
pear
打印set_intersection结果如下:
cherry
peanut
打印set_union结果如下:
apple
apricot
banana
cherry
grape
lemon
mango
orange
peanut
pear
打印set_difference结果如下:
apple
apricot
banana
orange
std::vector应用结果示例:
20
30
请按任意键继续. . .

3 总结

3.1 相同点

  • 引用头文件 #include

  • 因为std::set容器默认是有序的,因此set容器使用可随意使用这三个算法。

    详见示例中篮子1和篮子2的打印结果,尽管初始化往篮子中塞时候是无序的,但塞入之后容器会默认排好序。

  • 不仅仅只是std::set容器才可以应用这三个算法;其他容器也可以使用,但必须先保证容器中数据是有序的。

    详见示例中std::vector容器的应用示例。当然,实际工作中可先调用sort算法对容器中数据进行排序后再应用此算法。

    如果容器的数据无序,程序会“崩溃”。不妨可以把示例代码中第43行的std::vector中元素位置调换后再运行试试。

3.2 不同点

3.2.1 set_intersection

求两个容器中元素的交集。如下图所示:

3.2.2 set_union

求两个容器中元素的并集。如下图所示:

3.2.3 set_difference

求两个容器1与容器2中元素的差集。如下图所示:

3.2.4 差异对比

如下图所示:

posted @   kaizenly  阅读(588)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
打赏

喜欢请打赏

扫描二维码打赏

微信打赏

点击右上角即可分享
微信分享提示