сортировка — Пользовательская функция сравнения для сортировки в C ++ STL?

я использую

       typedef pair < long , pair <bool ,long > > t;
vector <t> time ;

и мне нужно отсортировать вышеупомянутый вектор с помощью функции std :: sort (), но с помощью настраиваемой функции сравнения. Я написал версию этого, но не работает должным образом. Можете ли вы указать на мою ошибку?

         bool comp ( const t &a , const t &b){

if ( a.first < b.first)
return a.first > b.first ;
else if ( b.first < a.first )
return b.first > a.first ;
else if ( a.first == b.first )
{
if ( a.second.first == false && b.second.first == true)
return a.first > b.first ;
else if ( a.second.first == true && b.second.first == false)
return b.first > a.first ;
else
return a.first > b.first ;
}
}inside main(){
sort ( time.begin() ,time.end() ,comp) ;
}

Индивидуальный случай:

      Before sorting : vector time
10 1 1
100 0 1
100 1 2
200 0 2
150 1 2
500 0 2
200 1 2
300 0 2
After Sorting :
10 1 1
100 0 1
100 1 2
150 1 2
200 0 2
200 1 2
300 0 2
500 0 2

Заранее спасибо .

0

Решение

Ваша функция сравнения не определяет порядок. По факту,
кажется, вернет истину в любое время a.first != b.first,

Я не уверен, какой заказ вы хотите. Стандарт
упорядочение std :: pair приведет к чему-то вроде:

bool
comp( t const& a, t const& b )
{
if ( a.first != b.first )
return a.first < b.first;
else if ( a.second.first != b.second.first )
return a.second.first < b.second.first;
else
return a.second.second < b.second.second;
}

Это на самом деле немного сложнее, так как единственное сравнение
оператор это использует <, Но если < а также != оба
доступны, и ведут себя нормально, результаты такие же, как
выше.

Вы можете легко принять это, чтобы сравнить элементы в любом
заказать вы хотите; если вы хотите изменить порядок для одного из
элементы, просто заменить < с >,

И наконец, false меньше чем сравнивает true для логического
ценности.

1

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

Так должно быть:

if ( a.first < b.first)
return true
else if ( b.first < a.first )
return false;
// etc.

В вашей версии он возвращает false в обоих случаях.

3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector