Ошибка в сортировке функций - PullRequest
1 голос
/ 18 апреля 2011

Я пытаюсь использовать функцию сортировки из STL, но она выдает ошибку во время выполнения.

Моя функция сравнения возвращает true, если v меньше, чем e:

bool smallerThan(VertexEntry &v, VertexEntry &e) {
   if(v.v[0] < e.v[0]) return true;
   else if(v.v[1] < e.v[1]) return true;
   else if(v.v[2] < e.v[2]) return true;
   return false;
} 

и вот звонок:

sort(vertices.begin(),vertices.end(),smallerThan);

Размер вектора составляет приблизительно 400 элементов.

Может кто-нибудь помочь мне решить мою проблему? Спасибо !!

Ответы [ 2 ]

9 голосов
/ 18 апреля 2011

Ваша функция сравнения неверна - она ​​не требует строгого слабого упорядочения.

Используйте это:

bool smallerThan(VertexEntry const & v, VertexEntry const & e) {
   if (v.v[0] < e.v[0]) 
     return true;
   else if(v.v[0] > e.v[0]) 
     return false;
   else if(v.v[1] < e.v[1]) 
     return true;
   else if(v.v[1] > e.v[1])
     return false;
   else if(v.v[2] < e.v[2])
     return true;
   return false;
} 
2 голосов
/ 18 апреля 2011

Ваш оператор сравнения не применяет строгий слабый порядок. Если вы можете использовать один прием трюка, который я видел, это привязать ваш объект к boost::tuple и использовать его строго слабый operator<.

Если вам нужно написать это самостоятельно, должно сработать что-то вроде этого:

bool smallerThan(const VertexEntry &v, const VertexEntry &e)
{
   if(v.v[0] != e.v[0]) return v.v[0] < e.v[0];
   else if(v.v[1] != e.v[1]) return v.v[1] != e.v[1];
   else return v.v[2] < e.v[2];
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...