0

我定义了以下函数对象:

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 返回 [first, last) 中的第一个迭代器 i,这样,对于 [first, last) 中的每个迭代器 j,comp(*i, *j)是假的。”

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

4

1 回答 1

0

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

我猜,你的结果从来没有像lhs在比较过程中那样出现,而且每次它都没有被过滤,因为 rhs 的第二个值小于 0.99。

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

于 2012-12-23T12:36:47.397 回答