从向量集中修剪非公共元素

Posted

技术标签:

【中文标题】从向量集中修剪非公共元素【英文标题】: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 算法或构造可以为我完成这项工作,还是我需要自己编写?

【问题讨论】:

Create new vector from others, using only duplicates的可能重复 这个问题有一些其他问题没有涉及到的元素,例如 Pair 不是可排序的类型。 这是一个不同的问题。您可以使用可排序的std::pair,或为您的班级提供operator &lt;。阅读How can I use std::maps with user-defined types as key?。它处理std::map,但它解决了完全相同的问题。 @Steve 可以使用一个集合来代替。 好的,所以 Pairs 是不可排序的,但是我们可以为它们实现一个哈希函数吗? 【参考方案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)时间和空间。

【讨论】:

以上是关于从向量集中修剪非公共元素的主要内容,如果未能解决你的问题,请参考以下文章

查找多个向量之间的公共元素(无整数元素)

r从向量中获取最后和第一个非NA元素

从具有重复元素的向量生成所有唯一组合

从末尾删除向量中的所有空元素

将指针向量元素推回非指针向量c ++时出错

matlab中怎么查找一个向量中第一个非零元素的位置 如P=[0;1;2] 第一个非零元素的位置为2,在mbtlab中怎么