Функциональный объект не работает должным образом

Я определил следующий функциональный объект:

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) так, что для каждого итератора j в [first, last)
comp (* i, * j) ложно. «

Таким образом, нет способа выбрать это, поскольку для этого кортежа оператор никогда не возвращает false. Пожалуйста, дайте мне знать, что я делаю неправильно

0

Решение

Предикат помогает алгоритму определить, какой элемент выбрать. Если предикат возвращается true алгоритм предпочитает rhs над lhs, Если он вернется false алгоритм предпочитает lhs над rhs, В случае, когда предикат всегда возвращается true алгоритм выберет последний элемент в массиве. Это верно как для алгоритмов stl, так и для тяги.

Я думаю, что ваш результат никогда не происходил как lhs во время процесса сравнения, и каждый раз он не был отфильтрован, так как второе значение rhs было меньше 0,99.

Если вы хотите отфильтровать такие значения, вам лучше переписать свой предикат.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]