提问者:小点点

两组以上的高效安全交叉口


下面是一个C++程序,它使用std::set_conterctions两次计算3个集合的交集(然后打印结果)。它产生预期的结果3,但是:

>

  • 将“newset”同时作为源和在第二次调用set_conterctions时设置了目标吗?据我所知,使用begin()和end(),我将引用传递给这些集合,所以我是否会意外地重写我的输入呢?

    这里有没有更有效率的办法?我应该按升序迭代我的集合吗?相对于多次调用std::set_contracters,滚动我自己的多集交集有什么优势吗?

    #include <algorithm>
    #include <iostream>
    #include <set>
    
    int main()
    {
        std::set<int> set_1 = {1,2,3}, set_2 = {2,3}, set_3 = {3}, newset;
        
        std::set_intersection(set_1.begin(), set_1.end(),
                      set_2.begin(), set_2.end(),
                      std::inserter(newset, newset.begin()));
    
        std::set_intersection(newset.begin(), newset.end(),
                      set_3.begin(), set_3.end(),
                      std::inserter(newset, newset.begin()));
    
        for(std::set<int>::iterator it = newset.begin(); it != newset.end(); it++){
            std::cout << *it;
        }
        std::cout << std::endl;
        
        return 0;
    }
    

  • 共1个答案

    匿名用户

    正如您在cppreference上所看到的,

    [...]结果范围不能与任何一个输入范围重叠。

    所以你很可能处于未定义的行为状态。

    因此,看来还得靠另一个临时的。另一方面,在第二次调用stdd::set_conterctions时,可以使用set_1作为目标集。

    STL似乎不包含一个用于相交两个以上集合的解决方案,原因很简单,算法的接口被迭代器“污染”了,即它将开始和结束迭代器用于集合,而不是集合本身作为输入;它还返回一个迭代器。

    PorbabilyBoost有一些有用的东西,但我还没有找到它。