C++ 在无序集上执行集_差分

C++ 在无序集上执行集_差分,c++,stl,C++,Stl,该算法需要以下内容 范围内的元件应根据相同标准进行订购 对于哈希表来说,情况并非如此 我正在考虑根据std::remove\u copy实现一个集合差a-B,其中移除标准是集合B中存在a的元素 是否有一种标准有效、最快、最安全的方法来执行此操作?如果您有两个哈希表,最有效的方法应该是迭代其中一个,在另一个哈希表中查找每个元素。然后将找不到的插入第三个容器中。草图可能如下所示: std::vector<int> result; std::copy_if(lhs.begin(), lhs

该算法需要以下内容

范围内的元件应根据相同标准进行订购

对于哈希表来说,情况并非如此

我正在考虑根据
std::remove\u copy
实现一个集合差a-B,其中移除标准是集合B中存在a的元素


是否有一种标准有效、最快、最安全的方法来执行此操作?

如果您有两个哈希表,最有效的方法应该是迭代其中一个,在另一个哈希表中查找每个元素。然后将找不到的插入第三个容器中。草图可能如下所示:

std::vector<int> result;
std::copy_if(lhs.begin(), lhs.end(), std::back_inserter(result),
    [&rhs] (int needle) { return rhs.find(needle) == rhs.end(); });
std::向量结果;
std::copy_if(lhs.begin()、lhs.end()、std::back_插入器(result),
[&rhs](int针){返回rhs.find(针)=rhs.end();});

如果你有两个长度为Na和Nb的无序集合A和B,并且你想做一个集合差异,即获取A的所有元素不在B中,那么由于在B中的查找是常数时间,那么简单地在A上迭代并检查它是否在B中的复杂性是O(Na)

如果A是一个无序集,B是一个集(或排序向量等),那么每个查找都将是log(Nb),因此完整的复杂性将是O(Na*log(Nb))

首先对A进行排序将使(Na*log(Na))进行排序,然后Na+Nb进行合并。如果Na明显小于Nb,那么Na*log(Nb)明显小于Na+Nb,如果Na向Nb变大,那么首先对其进行排序不会更快


因此,我认为对第一个对象进行排序(首先对其进行排序,我的意思是将其移动到已排序的集合中)不会带来任何好处。

使用临时std::set对象并将哈希表数据插入std::set对象可能会更快(我确信更安全)。然后调用set_difference()并将结果输出回哈希表。我是一个建议者,首先要确保事情顺利进行,然后在必要时进行优化。好吧,如果你真的想做一个临时拷贝,请使用std::vector和std::sort,而不是std::set。它会(很多!)更快,内存效率更高。我更喜欢rhs.count(pine)==0;然而,我对你的回答的主要批评是,你刚刚给出了你的算法和代码,但没有说明为什么你认为它是最快的可用方法。@CashCow:或者,因为TIMTOWTDI.:-)