Как я могу отсортировать векторные элементы, используя члены в качестве ключа в C ++ - PullRequest
3 голосов
/ 08 июня 2010

предположим, у нас есть

vector<student> allstudent

Теперь я хотел бы отсортировать студентов по разным элементам, таким как имя, возраст, адрес и т. Д.

Как я могу это сделать

Ответы [ 5 ]

26 голосов
/ 08 июня 2010

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

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

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

// sort by age
std::sort(students.begin(), students.end(), by_age());

// sort by name
std::sort(students.begin(), students.end(), by_name());

Начиная с C ++ 11, вы можете использовать лямбда-выражение для сравнения "на месте", что-то вроде этого:

// sort by name:
std::sort(students.begin(), students.end(), 
    [](student const &a, student const &b) {
        return a.name < b.name; 
    });

// sort by age:
std::sort(students.begin(), students.end(), 
    [](student const &a, student const &b) {
        return a.age < b.age; 
    });
8 голосов
/ 08 июня 2010

std::sort(students.begin(), students.end(),
  [](student const& stud1, student const& stud2) -> bool
  {
    return stud1.name() < stud2.name();
  });

Или, если у вас нет доступа к компилятору с лямбда-операторами:


std::sort(students.begin(), students.end(),
          boost::bind(&student::name, _1) < boost::bind(&student::name _2));

Или сделай это по-гробовски. Я старался избегать стандартных алгоритмов, когда вам приходилось так делать, хотя ... я ленивый.

8 голосов
/ 08 июня 2010

Это два простых способа:

bool operator <(const student &lhs, const student &rhs)
{
    return lhs.age < rhs.age;
}

std::sort(allstudent.begin(), allstudent.end()); // sorts by age

Или написать функцию сравнения:

bool cmp(const student &lhs, const student &rhs)
{
    return lhs.age < rhs.age; // here go your sort conditions
}

std::sort(allstudent.begin(), allstudent.end(), cmp); // also sorts by age
3 голосов
/ 09 июня 2010

В дополнение к более ранним комментариям вы также можете определить многомерные фильтры, например:

bool operator <(const student &a, const student &b)
{
    return ((a.age < b.age) ||
            ((a.name < b.name) && (a.age == b.age)) ||
            ((a.address <= b.address) && (a.name == b.name) && (a.age == b.age)))
}

Так же, как оператор выше, вы можете создавать более сложные фильтры, если это необходимо.

0 голосов
/ 08 июня 2010

в целом, boost :: multi_index предоставляет множество этих функций. Это особенно полезно, если вам нужен быстрый доступ к нескольким клавишам. Этот ответ не поможет вам с вашей домашней работой, хотя ;-) Смотри http://www.boost.org/

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