c++ - 如何获得比较两个 vector 对的子集?

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

如果两个或多个整数对(第一个)是每个 vector 的子集,如何获得第三个 vector ,该 vector 是比较两个 vector 对的子集。

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

比较 vector A和 vector B的结果:

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)

应该导致 vector C包含:

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

我一直在研究 std::set_intersection,但不知道如何成对执行此操作。

最佳答案

一般来说,如果你想求2 std::vector s 的交集,您可以使用 std::set_intersection 算法。如果 vector 未按排序顺序提供,则必须按 std::sort 排序。 .

在两种算法中,元素都是使用operator<进行比较的。 。如果operator<没有在 vector 的元素类型上定义,那么您必须显式地将比较器传递给 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 );

关于c++ - 如何获得比较两个 vector 对的子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51459880/

相关文章:

c++ - 使用 c++17 的弱绑定(bind)

c++ - Visual Studio 在引用堆栈变量时不使用 EBP

c++ - 如何正确使用boost::error_info?

c++ - 创建一个表现出与 STL 容器 std::set 完全相同行为的类型

c++ - constexpr vs const vs constexpr const

c++ - 变量模板编译时数组

c++ - 析构函数调用中出现信号 11 的可能原因是什么?

c++ - GNU 使 : generate list of source files

c++ - 与 using 声明冲突的重载

templates - 通过模板别名显式实例化类