这是我的问题:我有std::vector<std::unordered_set<int>>
。一些无序集合是相同的但不是相同的顺序(我知道在unordered_set中顺序是不明确的)。要删除重复项(在数学意义上的集合,例如{1,3,2} == {3,2,1}),我考虑使用std::unique()
,但这不起作用。搜索后我甚至注意到向量中的数据需要排序,在这种情况下没有意义。是否有一个函数可以删除std::vector<std::unordered_set<int>>
中的重复项?我可以自己做,我只是想知道我是否错过了stl中的某些内容。另外,如果您知道如何使用不同的容器解决此问题,请告诉我。效率在这里不是一个大问题,在这种情况下,该向量中的元素不超过200个。
TLDR;如何删除std::vector<std::unordered_set<int>>
中的重复项?
答案 0 :(得分:2)
效率在这里不是一个大问题
然后让我们狂野! operator<
已定义std::vector<std::unordered_set<int>> v = ...;
std::sort(v.begin(), v.end(), [](auto const& lhs, auto const& rhs){
return std::set<int>(lhs.begin(), lhs.end()) <
std::set<int>(rhs.begin(), rhs.end());
});
v.erase(std::unique(v.begin(), v.end()), v.end());
,所以让我们即时构建它们!
unordered_set<unordered_set<int>>
就运行时而言,这肯定是非常糟糕的,但它确实有效!
或者你可以制作一个{{1}}并提出一个独立于排序的哈希,这样你就不必再开始这样做了。
答案 1 :(得分:0)
谢谢你们。我遵循了n.m的建议,因为我认为它确实是最简单的。 看起来像这样:
std::vector<std::set<int>> resultP;
...............................................
// Remove the duplicate (without order), we want combinations not permutations.
std::vector<std::set<int>> resultC;
bool permAlreadyThere = false;
for (auto& perm : resultP)
{
for (auto& comb : resultC)
{
if (perm == comb)
{
permAlreadyThere = true;
break;
}
}
if (!permAlreadyThere) resultC.push_back(perm);
permAlreadyThere = false;
}