函数对象无法正常工作(Function object not working properly)

2019-08-04 13:14发布

我已经定义了下面的函数对象:

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定义如下:

“这个版本比较了使用一个函数对象补偿对象。具体地,该版本max_element在返回第一个迭代I [第一,最后一个),使得对于在每一个迭代f] [第一,最后一个),对比例(* 1,* j)的是假的。”

因此,有没有办法这应该被选择作为该元组,运算符从不返回false。 请让我知道我做错了

Answer 1:

谓词有助于算法来确定更喜欢哪件。 如果谓词返回true的算法更喜欢rhslhs 。 如果返回false的算法更喜欢lhsrhs 。 在当谓词总是返回的情况下true的算法将选择在数组中最后一个元素。 这对于STL和推力算法真实。

我想,你的结果不会发生如lhs在比较过程和每一个它,因为RHS的第二个值没有过滤时间小于0.99。

如果要过滤这些值,你最好重写你的谓语。



文章来源: Function object not working properly