Re: std::list.sort()
От: Павел Кузнецов  
Дата: 13.10.02 12:02
Оценка: 3 (1)
Здравствуйте peter@work, Вы писали:

>у меня есть list из своих class'ов и я хочу их отсортировать по определенному полю. Или для этого все-таки свою ф-цию писать?


Функцию сортировки? Ни в коем разе. Тем более, что для списка сделать эффективную сортировку "снаружи" невозможно. Достаточно написать свою функцию сравнения.

>
>class CStudent
>{
>public:
>[skip]
>private:
>    std::string FName;        // Имя
>    std::string MName;        // Отчество
>    std::string LName;        // Фамилия
>    <...>


Т.к. все данные-члены класса CStudent private, предполагаем, что существуют соответствующие const public функции доступа с именами fname, mname, lname.

>И вот я хочу отсортировать по ФИО.


Допустим, что имеется в виду сортировка по фамилиям, при одинаковых фамилиях — по именам, при одинаковых фамилиях и именах — по отчествам.

struct CStudentNameIsLess
{
  // true, если l "меньше" r по выбранному критерию
  bool operator()(const CStudent& l, const CStudent& r) const
  {
     int lname_cmp = l.lname().compare(r.lname());   // сравнить фамилии
     if (lname_cmp < 0)
     {
       return true;                                  // фамилия "меньше"
     }
     else if (lname_cmp == 0) 
     {
       int fname_cmp = l.fname().compare(r.fname()); // фамилии одинаковые, сравнить имена
       if (fname_cmp < 0)
         return true;                                // имя "меньше"
       else if (fname_cmp == 0)
         return l.mname() < r.mname();               // имена одинаковые, сравнить отчества
     }
     return false;
  }
};

slist.sort(CStudentNameIsLess());
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.