Сортировка векторных объектов с помощью лямбда, без сортировки в конце

#c #sorting #c 11 #vector #lambda

#c #сортировка #c 11 #вектор #лямбда

Вопрос:

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

 std::sort(eventvec.begin(), eventvec.end(), [](const eventamp; lhs, const eventamp; rhs) {
    return lhs.getim < rhs.getim;});
  

У меня было несколько ошибок при его написании, а затем я как бы наложил его на функцию внутри функции, поскольку для этого требовалась статическая функция.

Функциями, объявленными в классе, являются:

 double event::getut() { return unift; }

static double getim(event amp;a) { return a.getut(); }
  

В итоге сортировка вообще не в порядке. В атрибуте также есть отрицательные значения. Есть какие-нибудь предложения?

Комментарии:

1. Какие ошибки существуют? Я думаю, вам следует использовать return lhs.getim() < rhs.getim(); вместо того, что вы написали.

2. Вы не вызываете функцию. return lhs.getut() < rhs.getut() но это означает, что вам нужно сделать getut() const . Вот так: double event::getut() const { return unift; }

3. @TanveerBadar, который запрашивал бы аргументы, и что мне вводить в качестве аргумента, потому что lhs.getim(lhs) не работает.

4. ошибка @RetiredNinja: передача ‘const event’ в качестве аргумента ‘this’ отбрасывает квалификаторы [-fpermissive] И ————————————————————————————— примечание: при вызове двойного события ::getut()’двойное событие::getut() ^ ~~~~

5. Вы не прочитали все, что я написал. «это означает, что вам нужно сделать getut() const . Вот так: double event::getut() const { return unift; } »

Ответ №1:

Вы сортируете свои события по адресу event::getim , который одинаков для каждого события.

Я думаю, вы имеете в виду вызов функции-члена event , которая должна вызываться из const event

 double event::getut() const { return unift; }

std::sort(eventvec.begin(), eventvec.end(), [](const eventamp; lhs, const eventamp; rhs) {
return lhs.getut() < rhs.getut(); });
  

Комментарии:

1. @wakanada вам нужно отредактировать event::getut , как показано на рисунке. Он должен быть доступен для вызова из const event

2. да, понял. Спасибо