下面是一个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;
}
正如您在cppreference上所看到的,
[...]结果范围不能与任何一个输入范围重叠。
所以你很可能处于未定义的行为状态。
因此,看来还得靠另一个临时的。另一方面,在第二次调用stdd::set_conterctions
时,可以使用set_1
作为目标集。
STL似乎不包含一个用于相交两个以上集合的解决方案,原因很简单,算法的接口被迭代器“污染”了,即它将开始和结束迭代器用于集合,而不是集合本身作为输入;它还返回一个迭代器。
PorbabilyBoost有一些有用的东西,但我还没有找到它。