【问题标题】:Prune non-common elements from set of vectors从向量集中修剪非公共元素
【发布时间】:2019-05-21 12:12:12
【问题描述】:

假设我有一组向量,其中 Pair 定义如下:

struct Pair
{
   int A;
   int B;
}

std::vector<Pair> a = { {1,2}, {4,8}, {5,1}, {10,3} };
std::vector<Pair> b = { {1,2}, {4,9}, {5,1}, {10,3} };
std::vector<Pair> c = { {1,3}, {4,10}, {5,1}, {10,4} };

我想创建一个新向量,这样只有所有输入向量共有的元素才会输入到新向量中,如下所示:

std::vector<Pair> abc = { {5,1} }; //  {5,1} is only common value.

我看到很多关于如何删除重复项的问题,但我希望只保留重复项。

我问了一个类似的问题,但忽略了不可排序的 Pair 类型,这改变了问题。

是否有现有的高效 STL 算法或构造可以为我完成这项工作,还是我需要自己编写?

【问题讨论】:

  • 这个问题有一些其他问题没有涉及到的元素,例如 Pair 不是可排序的类型。
  • 这是一个不同的问题。您可以使用可排序的std::pair,或为您的班级提供operator &lt;。阅读How can I use std::maps with user-defined types as key?。它处理std::map,但它解决了完全相同的问题。
  • @Steve 可以使用一个集合来代替。
  • 好的,所以 Pairs 是不可排序的,但是我们可以为它们实现一个哈希函数吗?

标签: c++ algorithm stl


【解决方案1】:

使用哈希表来跟踪您看过每个人的次数:

std::vector<Pair> abc;
std::unordered_map<Pair, int> count;

for (const auto& vec : {a, b, c})
    for (const Pair& pair : vec)
        if (++count[pair] == 3)
            abc.push_back(pair);

是O(n)时间和空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多