zoukankan      html  css  js  c++  java
  • 算法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 差异对比

    如下图所示:

  • 相关阅读:
    监控 | open-falcon | 安装
    日语 | 日本50音
    PXE | 开关机
    linux | 网卡驱动
    Linux——Centos 7 chmod命令
    Linux——Centos 7 ls命令
    Linux——Centos 7 passwd命令
    Linux——Centos 7 账户管理命令(用户组篇)groupadd groupmod groupdel
    Linux——Centos 7 账户管理命令(用户篇)useradd usermod userdel
    Linux——Centos 7 diff命令
  • 原文地址:https://www.cnblogs.com/Braveliu/p/15658590.html
Copyright © 2011-2022 走看看