如果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
,但看不到如何配对使用。
答案 0 :(得分:4)
通常,如果要找到2 std::vector
s的交集,则可以使用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 );