如何获得比较两个向量对的子集?

时间:2018-07-21 20:30:20

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

如果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,但看不到如何配对使用。

1 个答案:

答案 0 :(得分:4)

通常,如果要找到2 std::vectors的交集,则可以使用std::set_intersection算法。如果未按顺序提供矢量,则必须按std::sort进行排序。

在两种算法中,都使用operator<比较元素。如果未在向量的元素类型上定义operator<,则必须显式地将比较器传递给std::sortstd::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 );