我定义了以下函数对象:
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 ;
}
};
其中DereferencedIteratorTuple如下:
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
定义如下:
“此版本使用函数对象comp比较对象。 具体来说,这个版本的max_element返回第一个迭代器i 在[first,last]中,对于[first,last]中的每个迭代器j, comp(* i,* j)是假的。“
因此,没有办法选择这个元组,操作符永远不会返回false。请让我知道我做错了什么
答案 0 :(得分:0)
谓词帮助算法确定要选择哪个元素。如果谓词返回true
,则算法优先于rhs
lhs
。如果它返回false
,则算法优先于lhs
rhs
。在谓词始终返回true
的情况下,算法将选择数组中的最后一个元素。对于stl和推力算法都是如此。
我猜,你的结果在比较过程中从未出现lhs
,而且每次都没有过滤,因为rhs的第二个值小于0.99。
如果你想过滤这些值,你最好重写你的谓词。