Сортировка std :: list, который содержит структуры - PullRequest
1 голос
/ 17 марта 2019

Так что у меня возникли проблемы с определением правильного использования list::sort() в отношении списка структур.Вот соответствующий код:

struct student
{
    char firstnm[20],   
        lastnm[20];     
    int id,             
        grade;
};
list<student> sList;

//Irrelevant code...

cout << "Please enter your own name, id, and grade. (Ex: myfirst mylast 0 12)\n";
cin >> data.firstnm >> data.lastnm >> data.id >> data.grade;
sList.push_back(data);
sList.sort();

Проблема, которую я пытаюсь решить, заключается в использовании sList.sort() для сортировки по id.Тем не менее, я понятия не имею, как правильно передать его в list::sort().Заранее спасибо за любую помощь / время!

РЕДАКТИРОВАТЬ: решение было просто добавить это в мою структуру

bool operator < (const student& cmp) const {
   return id < cmp.id;
}

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

Функция-член std::list::sort() перегружена.std::list имеет обычную функцию-член, которая не принимает параметров и использует operator< для сортировки элементов списка:

void sort();

Также имеется шаблон функции-члена, принимающий один параметр comp, который используетсяв качестве предиката для сортировки элементов:

template<class Compare> 
void sort(Compare comp);

Предполагается, что вы хотите отсортировать student объекты в вашем списке по ключу id в по возрастанию .Вы можете либо определить operator< для своего пользовательского student класса как:

bool operator<(student const& a, student const& b) {
   return a.id < b.id;
}

и использовать перегрузку, которая не принимает параметров:

sList.sort(); // 1st overload

или просто добавить лямбдувыражение для шаблона функции-члена, принимающее один параметр:

auto cmp = [](auto const& a, auto const& b) {
   return a.id < b.id;
}; 

sList.sort(cmp); // 2nd overload

при таком подходе вам не нужно определять operator< для вашего student класса.


Примечаниечто вы не можете использовать алгоритм std::sort() на итераторах std::list, поскольку для этого алгоритма требуются итераторы с произвольным доступом , но std::list предоставляет только двунаправленные итераторы.Поэтому следующий код не будет компилироваться:

std::sort(sList.begin(), sList.end());

Вместо этого вы должны использовать функции-члены, предоставляемые std::list, чтобы отсортировать элементы контейнера, как описано выше.

0 голосов
/ 17 марта 2019

Вы должны взглянуть на std :: sort.(https://en.cppreference.com/w/cpp/algorithm/sort) Существует несколько определений этой функции, и в одном из них вы можете указать, что вы хотите отсортировать.

Кроме того, посмотрите на этот пост, я думаю, это то, что вам нужно:https://stackoverflow.com/a/21234017/6663947

Редактировать:

Это пример компаратора:

sList.sort([](const student & a, const student & b) { return a.id < b.id; });

Я не пробовал, но это должно выглядеть так. Кроме того, это дляc ++ 11

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...