如何从c ++中的两个向量获得相同的对

时间:2015-11-30 15:10:06

标签: c++ c++11

我定义了两个向量: std::vector<std::pair<int, int> > vec1std::vector<std::pair<int, int> > vec2

我想从vec1vec2找到相同的对。 例如,vec1 = {{1,2}, {1,9}, {2,13}, {3,5}}vec2 = {{8, 7}, {4,2}, {2,10}, {1,9}}。然后结果应为{{1,9}}

我该怎么做?

2 个答案:

答案 0 :(得分:7)

如果您使用std::sort对矢量进行排序,然后使用std::set_intersection以下列方式查找其常用元素,则可以执行此操作:

std::vector<std::pair<int, int>> v1 {{1,2}, {1,9}, {2,13}, {3,5}};
std::vector<std::pair<int, int>> v2 {{8,7}, {4,2}, {2,10} ,{1,9}};

std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());

std::vector<std::pair<int, int>> v_intersection;
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(),
                      std::back_inserter(v_intersection));

LIVE DEMO

答案 1 :(得分:3)

answer by 42的运行时间为O(n * log(n)),用于两个向量的排序过程(其中n是较大向量的大小)。如果这是一个问题,您还可以创建unordered_set并使用一个向量的元素填充它,然后使用copy_if仅保留另一个向量中也包含在this answer中的元素{1}},导致O(n)的运行时间。

set

struct pairhash { template <typename T, typename U> std::size_t operator()(const std::pair<T, U>& p) const { return std::hash<T>()(p.first) ^ std::hash<U>()(p.second); } }; struct pairequal { template <typename T, typename U> bool operator()(const std::pair<T, U>& p0, const std::pair<T, U>& p1) const { return (p0.first == p1.first) && (p0.second == p1.second); } }; void findEqualPairs() { std::vector<std::pair<int, int>> vec1{ { 1, 2 }, { 1, 9 }, { 2, 13 }, { 3, 5 } }; std::vector<std::pair<int, int>> vec2{ { 8, 7 }, { 4, 2 }, { 2, 10 }, { 1, 9 } }; std::unordered_set<std::pair<int, int>, pairhash, pairequal> set2( vec2.begin(), vec2.end()); std::vector<std::pair<int, int>> intersection; std::copy_if(vec1.begin(), vec1.end(), std::back_inserter(intersection), [&](const std::pair<int, int>& p) { return set2.find(p) != set2.end(); }); std::cout << "intersection:" << std::endl; for (auto it : intersection) { std::cout << it.first << ", " << it.second << std::endl; } } 取自