gpt4 book ai didi

c++ - std::set_intersection,带偏移量的交集列表

转载 作者:行者123 更新时间:2023-11-28 05:54:31 25 4
gpt4 key购买 nike

我需要获取两个 vector 之间的交集列表。在我的例子中, vector 是用户类型的 vector 。所以为了获得封装的数字,我必须使用比较器函数。

我还希望能够获得与偏移量的交集。例如,给定两个 vector {1,2,3,4,6,8} 和 {5, 7, 9,10} 。由于 3 + 2 = 5 和 8 + 2 = 10,与偏移集 2 的交集是 { 3,8 }。

我想下面的代码应该可以工作,但我得到的是 {3,8} {3,6,8} 。我不知道如何使用 std::set_intersection 的比较器函数。我错过了什么?

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>


struct A
{
A ( int in ) { a = in; }
int getNumber() { return a; }

bool operator< ( A rhs )
{
return this->a < rhs.a;
}
int a;
};

int main()
{
std::vector<A> v1{1,2,3,4,6,8};
std::vector<A> v2{5, 7, 9,10};
int offSet = 2;
auto lessThanWithOffset = [offSet]( A lhs, A rhs)
{
return lhs.getNumber() + offSet < rhs.getNumber();
};

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

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

for(auto n : v_intersection)
std::cout << n.getNumber() << ' ';
}

最佳答案

参见 this , 因为

The type T satisfies Compare if

  • The type T satisfies BinaryPredicate, and

Given

  • comp, an object of type Compare

  • equiv(a, b), an expression equivalent to !comp(a, b) && !comp(b, a)

The following expressions must be valid and have their specified effects

  • For all a, comp(a,a)==false

  • If comp(a,b)==true then comp(b,a)==false

  • if comp(a,b)==true and comp(b,c)==true then comp(a,c)==true

  • For all a, equiv(a,a)==true

  • If equiv(a,b)==true, then equiv(b,a)==true

  • If equiv(a,b)==true and equiv(b,c)==true, then equiv(a,c)==true

所以 equiv(A(6), A(7)) == true因为!((6+2) < 7) && !((7+2) < 6)

实际上,您的 lessThanWithOffset不符合标准,因为 equiv(A(6), A(8)) == trueequiv(A(8), A(10)) == true ,但是equiv(A(6), A(10)) == false

关于c++ - std::set_intersection,带偏移量的交集列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34488706/

25 4 0
文章推荐: c++ - 输入参数不起作用
文章推荐: javascript - 尽可能缩放固定大小的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com