在std :: vector上使用std :: unique()<std :: unordered_set <t>&gt;

时间:2016-08-04 13:33:10

标签: c++ c++11 data-structures stl

这是我的问题:我有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>>中的重复项?

2 个答案:

答案 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;
}