【问题标题】:Using std::unique() on a std::vector<std::unordered_set<T>>在 std::vector<std::unordered_set<T>> 上使用 std::unique()
【发布时间】:2016-08-04 13:33:10
【问题描述】:

这是我的问题:我有一个std::vector&lt;std::unordered_set&lt;int&gt;&gt;。其中一些无序集是相等的,但顺序不同(我知道在 unordered_set 中顺序是不明确的)。要删除重复项(在数学意义上的集合,例如 {1,3,2} == {3,2,1}),我考虑过使用std::unique(),但这不起作用。经过搜索,我什至注意到向量中的数据需要排序,这在这种情况下没有意义。是否有删除std::vector&lt;std::unordered_set&lt;int&gt;&gt; 中重复项的功能?我可以自己做我只是想知道我是否错过了 stl 中的某些内容。另外,如果您知道如何使用不同的容器解决此问题,请告诉我。效率在这里不是一个大问题,在这种情况下,该向量中的元素不超过 200 个。

TLDR;如何删除std::vector&lt;std::unordered_set&lt;int&gt;&gt; 中的重复项?

【问题讨论】:

  • 您使用unordered_set 而非set 是否有原因?如果您使用set,则包含相同元素的两个集合将具有相同的顺序。
  • 您可以在 O(n^2) 时间内通过比较(为了相等)每个数组元素与其他数组元素来删除重复项。

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


【解决方案1】:

效率在这里不是大问题

那么让我们疯狂吧! set 已定义 operator&lt;,所以让我们快速构建它们!

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&lt;unordered_set&lt;int&gt;&gt; 并提出一个独立于排序的哈希,这样您一开始就不必执行任何操作。

【讨论】:

  • 如果效率很重要,我认为使用boost::multi_index 并同时进行无序和有序访问会更容易。
  • std::unique 不需要相同的 lambda 来检测重复项吗?
  • @Slava unique 的谓词是比较两个元素是否相等。 unordered_set 已经是 EqualityComparable。
【解决方案2】:

谢谢你们。我遵循了 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 2019-10-20
    • 2015-10-11
    • 1970-01-01
    • 2017-09-01
    • 2023-02-16
    相关资源
    最近更新 更多