Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::set_交叉点用于已排序的范围,[_]用于未排序的范围/容器_C++_Intersection_Sorted_Idioms_Unordered Set - Fatal编程技术网

C++ std::set_交叉点用于已排序的范围,[_]用于未排序的范围/容器

C++ std::set_交叉点用于已排序的范围,[_]用于未排序的范围/容器,c++,intersection,sorted,idioms,unordered-set,C++,Intersection,Sorted,Idioms,Unordered Set,std::set_intersection获取元素的排序范围(以及迭代器对)。但假设我有未排序的数据,例如两个std::unordered_sets。有没有一个标准的交叉点功能?我不知道C++11中有这样的功能。答案是“不”。在这种情况下没有捷径。您应该检查较小集合中的每个元素在较大集合中的成员资格,如果找到,则将其插入到输出集合中。由于无序_集是使用带bucket的散列实现的,因此查找时间(使用适当的散列函数和合理的散列最大负载)应该很小。您应该能够在较小的集合上编写对for_的调用,该集合对

std::set_intersection
获取元素的排序范围(以及迭代器对)。但假设我有未排序的数据,例如两个
std::unordered_set
s。有没有一个标准的交叉点功能?

我不知道C++11中有这样的功能。答案是“不”。

在这种情况下没有捷径。您应该检查较小集合中的每个元素在较大集合中的成员资格,如果找到,则将其插入到输出集合中。由于无序_集是使用带bucket的散列实现的,因此查找时间(使用适当的散列函数和合理的散列最大负载)应该很小。您应该能够在较小的集合上编写对for_的调用,该集合对较大的集合执行检查,并插入到输出集合中,而不会变得太难看

如果要在两个原始集合中的一个集合中就地构建交点,可以检查其每个元素是否在另一个集合中,如果不在,则删除该元素。这可以用remove_写入,如果在保存结果的无序_集合上

另一种选择是使用copy_if和插入迭代器。在相同的时间和空间内,有很多方法可以实现这一点。选择一个似乎为了清晰而优化的


据我所知,没有一个固定的库函数可以为您完成此任务。

相关:。这是标准名称之前的名称。也不是一个完整的解决方案,所以我没有实际的投票结果。这将给你一个并集,而不是交集,而完成它的函数是
s1.insert(s2.begin(),s2.end())
Blarg。非常感谢。思考时分心,回答了错误的问题。我编辑了我的答案。