首页 > 解决方案 > 如何获得比较两个成对向量的子集?

问题描述

如果两个或多个对 int 的(第一个)是每个向量的子集,如何获得第三个向量,该向量将是比较两个对向量的子集。

const std::vector<std::pair<int, MyObj>> lhs; 
const std::vector<std::pair<int, MyObj>> rhs; 

比较vectorA和vectorB的结果:

vectorA
    pair(1, obj1)
    pair(2, obj2)
    pair(3, obj3)
    pair(4, obj4)

vectorB
    pair(2, obj2)
    pair(4, obj4)
    pair(5, obj5)
    pair(6, obj6)

应该导致vectorC包含:

pair(2, obj2)
pair(4, obj4)

我一直在看std::set_intersection,但看不到如何配对。

标签: c++c++11c++14

解决方案


一般来说,如果你想找到 2 std::vectors的交集,你可以使用std::set_intersection算法。如果向量没有按排序顺序提供,那么它们必须按 排序std::sort

在这两种算法中,元素都使用operator<. 如果operator<未在向量的元素类型上定义,则必须将比较器显式传递给std::sort相应的std::set_intersection算法:

#include <vector>       // std::vector, std::set_intersection
#include <utility>      // std::pair
#include <algorithm>    // std::sort
#include <iterator>     // std::back_inserter

bool comp(
    const std::pair<int, MyObj> &a,
    const std::pair<int, MyObj> &b )
{
    return a.first < b.first; 
}

std::vector<std::pair<int, MyObj>> lhs; 
std::vector<std::pair<int, MyObj>> rhs; 

std::sort( lhs.begin(), lhs.end(), comp );
std::sort( rhs.begin(), rhs.end(), comp );

std::vector<std::pair<int, MyObj>> result;
std::set_intersection(
    lhs.begin(), lhs.end(),
    rhs.begin(), rhs.end(),
    std::back_inserter(result), comp );

推荐阅读