【发布时间】:2018-06-26 05:34:57
【问题描述】:
我是 C++ 新手,有人要求我将 Java 程序转换为 C++。 我正在尝试编写一种方法来检查 unordered_set 中的所有元素是否存在于另一个 unordered_set 中。我找到了下面使用 hash_set 的示例,但不推荐使用 hash_set,建议现在使用 unordered_set。
// returns true if one contains all elements in two
bool SpecSet::containsAll(hash_set<Species*> one, hash_set<Species*> two) {
sort(one.begin(), one.end());
sort(two.begin(), two.end());
return includes(one.begin(), one.end(), two.begin(), two.end());
}
所以我需要一种使用 unordered_set 的方法。排序不适用于无序集,查找速度很重要,所以我不想使用有序集。
bool SpecSet::containsAll(unordered_set<Species*> one, unordered_set<Species*> two) {
return ?;
}
我真的很感激能帮助我有效地做到这一点。
编辑: 我想这会奏效。似乎没有更有效的方法,只能将所有内容一分为二。
bool SpecSet::containsAll(unordered_set<Species*> one, unordered_set<Species*> two) {
if(two.size() > one.size())
{
return false;
}
for(Species *species : two)
{
if(one.find(species) == one.end())
{
return false;
}
}
return true;
}
【问题讨论】:
-
一一检查每个元素? (可能在比较尺寸以排除明显的“否”情况后)
-
感谢 Caleth/Mark。您的提示使我编写了上述方法。我认为这是我能做的最好的吗?
-
我不是 100% 确定,但这似乎是最好的方法。复杂性是线性的,因为 find 是 const time。
-
没有一个神奇的按钮可以按下并立即得到答案,无论一个 unordered_set 是否包含另一个 unordered_set 的所有值。手册,一个一个,搜索是唯一的方法;禁止按小值集的顺序进行特殊用例,在这种情况下,可以使用位掩码等来完成一些愚蠢的事情......此外,这似乎比基于排序的更快,这似乎是
O(n log n),而手册查找似乎是O(n)。仅仅因为通过少量代码完成某事并不一定意味着它“更快”。
标签: c++ unordered-set