函数对象无法正常工作

Function object not working properly

本文关键字:工作 常工作 对象 函数      更新时间:2023-10-16

>我定义了以下函数对象:

struct Predicate1
{
__device__ bool operator () 
(const DereferencedIteratorTuple& lhs, const DereferencedIteratorTuple& rhs) 
{
using thrust::get;
//if you do <=, returns last occurence of largest element. < returns first
if (get<0>(lhs)== get<2>(lhs) && get<0>(lhs)!= 3) return get<1>(lhs) < get<1>(rhs); 
else
return true ;
}
};

其中取消引用迭代器元组如下所示:

typedef thrust::tuple<int, float,int> DereferencedIteratorTuple;

此外,我称之为:

result =  thrust::max_element(iter_begin, iter_end, Predicate1());

但结果是元组 (3,.99,4)。我很困惑为什么会是这个结果,因为条件get<0>(lhs)== get<2>(lhs)在这个元组的if中不成立。因此,运算符对于此元组的每个比较都返回 true。但是,thrust::max_element定义如下:

"此版本使用函数对象组合比较对象。 具体来说,这个版本的max_element返回第一个迭代器 i 在 [第一个, 最后一个) 中,对于 [第一个, 最后一个] 中的每个迭代器 j, comp(*i, *j) 是假的。

因此,对于这个元组,不应该选择这个元组,运算符永远不会返回 false。请让我知道我做错了什么

谓词有助于算法确定首选哪个元素。如果谓词返回true则算法优先rhs而不是lhs。如果它返回false则算法更喜欢lhs而不是rhs。在谓词始终返回true的情况下,算法将选择数组中的最后一个元素。对于 stl 和推力算法都是如此。

我猜,您的结果在比较过程中从未像lhs那样发生,并且每次都没有过滤,因为 rhs 的第二个值小于 0.99。

如果你想过滤这样的值,你最好重写你的谓词。