C++ 如何检查无序_集的重叠?

C++ 如何检查无序_集的重叠?,c++,algorithm,optimization,unordered-set,C++,Algorithm,Optimization,Unordered Set,我有两个无序的_集合,需要检查第一个集合的所有元素是否也是第二个集合的元素 有没有一种快速的方法可以做到这一点,或者我应该使用另一个容器?只需使用一个循环(或相应的算法)。复杂度(近似)与待测试范围的大小成线性关系 template <typename UnorderedSet, typename Iterator> bool contains_all(UnorderedSet&& set, Iterator first, Iterator last) { u

我有两个无序的_集合,需要检查第一个集合的所有元素是否也是第二个集合的元素

有没有一种快速的方法可以做到这一点,或者我应该使用另一个容器?

只需使用一个循环(或相应的算法)。复杂度(近似)与待测试范围的大小成线性关系

template <typename UnorderedSet, typename Iterator>
bool contains_all(UnorderedSet&& set, Iterator first, Iterator last)
{
    using value_type = std::iterator_traits<Iterator>>::value_type;
    return std::all_of(first, last, [&set] (const value_type& value) {
        return set.count(value);
    });
}
模板
bool包含所有(无序集&&set、迭代器优先、迭代器最后)
{
使用value\u type=std::iterator\u traits>::value\u type;
返回std::全部(第一、最后、[&集](常量值类型和值){
返回集合计数(值);
});
}
只需使用循环(或相应的算法)。复杂度(近似)与待测试范围的大小成线性关系

template <typename UnorderedSet, typename Iterator>
bool contains_all(UnorderedSet&& set, Iterator first, Iterator last)
{
    using value_type = std::iterator_traits<Iterator>>::value_type;
    return std::all_of(first, last, [&set] (const value_type& value) {
        return set.count(value);
    });
}
模板
bool包含所有(无序集&&set、迭代器优先、迭代器最后)
{
使用value\u type=std::iterator\u traits>::value\u type;
返回std::全部(第一、最后、[&集](常量值类型和值){
返回集合计数(值);
});
}

IIRC无法从
无序映射中获取元素的散列键。因此,您必须重新刷新每个元素。我认为集合的大小不一样,对吗?否则您可以使用
操作符==
。IIRC无法从
无序映射中获取元素的哈希键。因此,您必须重新刷新每个元素。我认为集合的大小不一样,对吗?否则您可以使用
操作符==
。这需要C++14。将
auto
替换为
Type
以使其针对C++11.1进行编译,我建议将其重命名为
unordered_includes
以模拟用于有序输入的
std::includes
。我也会给它4个迭代器作为参数,而不是2个容器。改变其中一个容器的类型可以提高性能吗?我会使用
UnorderedSet const&
作为参数类型(例如,否则你不能传递const左值)。哎呀,我总是忘记类类型的
const
。然而,
UnorderedSet const&
也可以接受左值和右值,并更清楚地表示参数没有更改。这需要C++14。将
auto
替换为
Type
以使其针对C++11.1进行编译,我建议将其重命名为
unordered_includes
以模拟用于有序输入的
std::includes
。我也会给它4个迭代器作为参数,而不是2个容器。改变其中一个容器的类型可以提高性能吗?我会使用
UnorderedSet const&
作为参数类型(例如,否则你不能传递const左值)。哎呀,我总是忘记类类型的
const
。然而,
UnorderedSet const&
也可以接受左值和右值,并更清楚地表示参数没有改变。