2013-06-19 2 views
0

У меня есть некоторые объекты, которые я хочу отсортировать на host_vector, Эти объекты имеют определенный оператор Operator <, который сравнивает Id (целое число) объектов. Вектор содержит указатели на объекты.thrust :: sort missorts some values ​​

Если я выполняю thrust::sort(object_vector.begin(),object_vector.end());, а затем перебирать вектор для печати идентификаторов я получаю:
48, 49, 0, 1, [..], 47, 50, [..]

Если я выполняю std::sort(object_vector.begin(),object_vector.end()); я получаю идентификаторы в порядке. Я не знаю, почему эти два значения не соответствуют порядку (они одинаковы для одного и того же количества объектов).
Объекты в соответствии с этим идентификатором не имеют ничего особенного.

stable_sort ничего не меняет. Сортировка вектора с работами Id. Операторы:

bool operator<(MultiLegBase* other){return (this->getID()<other->getID());} 
bool operator==(MultiLegBase* other){return this->getID()==other->getID();} 
bool operator>(MultiLegBase* other){return this->getID()>other->getID();} 
virtual unsigned int const getID(return m_Id;) 
+1

Что произойдет, если вы сначала создадите вектор только целочисленных идентификаторов, а затем 'thrust :: sort', что? Если он работает, ваш 'operator <' или ваш 'operator =', вероятно, ошибочны. – Useless

+2

Покажите нам соответствующий код для вашего объекта – Bart

+0

Предоставьте полный репроектор. Это не должно быть так сложно. В процессе создания репродуктора вы можете обнаружить эту проблему. –

ответ

1

Я снова посмотрел на своих операторов и получил то, что это не так. Ошибка конструкции this->getID(). Потому что operator>() не вызывается с двумя аргументами указателя (насколько я понимаю). Я решил это с помощью функтора: [..] bool operator()(Multibaseleg* M,Multibaseleg* N){return (M->getID()<N->getID());}[..]