【问题标题】:Merge multiple sets elements in a single set将多个集合元素合并到一个集合中
【发布时间】:2011-10-28 16:53:47
【问题描述】:

我想知道是否有任何 std 库或 boost 工具可以轻松地将多个集合的内容合并为一个。

就我而言,我有一些想要合并的整数集。

【问题讨论】:

    标签: c++ stl set


    【解决方案1】:

    看来您要的是std::set_union

    例子:

    #include <set>
    #include <algorithm>
    
    std::set<int> s1; 
    std::set<int> s2; 
    std::set<int> s3;
    
    // Fill s1 and s2 
    
    std::set_union(std::begin(s1), std::end(s1),
                   std::begin(s2), std::end(s2),                  
                   std::inserter(s3, std::begin(s3)));
    
    // s3 now contains the union of s1 and s2
    

    【讨论】:

    • 如果你不需要改变原来的结构,这个方案是最好的。
    【解决方案2】:

    使用C++17,可以直接使用setmerge函数。

    当您希望将 set2 元素提取并插入到 set1 作为合并的一部分时,这会更好。

    如下:

    set<int> set1{ 1, 2, 3 };
    set<int> set2{ 1, 4, 5 };
    
    // set1 has     1 2 3       set2 has     1 4 5
    set1.merge(set2);
    // set1 now has 1 2 3 4 5   set2 now has 1   (duplicates are left in the source, set2)
    

    【讨论】:

    • en.cppreference.com/w/cpp/container/set/merge 。复杂度 N*log(size()+N)),其中 N 是 source.size() ,我想最好将复杂度添加到答案中,因为这与将所有人都插入其中一样?
    • 为什么 C++ 不会重载 insert 所以你可以合并但复制?就像构建一个临时的并合并它一样简单:insert(set input) { merge(set(input)); }
    【解决方案3】:

    看看 std::merge 能为你做什么

    cplusplus.com/reference/algorithm/merge

    【讨论】:

      【解决方案4】:

      你可以这样做:

      std::set<int> s1;
      std::set<int> s2;
      // fill your sets
      s1.insert(s2.begin(), s2.end());
      

      【讨论】:

      • 我试图了解在合并上下文中插入多集和合并之间的区别。每次插入都需要 O(logn),所以总共 O(nlogn);其中 n 是较小容器的大小。而合并只需要 O(n1+n2)。我能想到使用 insert 的唯一原因是它接受任何迭代器,并且第二个复杂性在它之前的系数为 3。是否有任何其他强有力的理由支持插入而不是合并。
      • 并非如此,只是在所有条件相同的情况下,这是最简单、最通用的解决方案。
      • 这是一个次优的解决方案。请参阅 Antonio Pérez 的回答。
      • 不仅如此:在评估std::set_union() 的性能时,您应该考虑重复调用std::set::insert() 的成本。
      • 是的。如果未设置输出,我没有考虑插入。好吧,这样两者都在 O(n*log(n)) 中(假设集合相等)。抱歉吐槽了。
      猜你喜欢
      • 2019-10-07
      • 2013-01-10
      • 2011-09-24
      • 2013-03-28
      • 2019-02-08
      • 2023-03-31
      • 2011-06-21
      • 2023-03-07
      相关资源
      最近更新 更多