从向量集中修剪非公共元素
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 <
。阅读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)时间和空间。
【讨论】:
以上是关于从向量集中修剪非公共元素的主要内容,如果未能解决你的问题,请参考以下文章
matlab中怎么查找一个向量中第一个非零元素的位置 如P=[0;1;2] 第一个非零元素的位置为2,在mbtlab中怎么