В C ++ возможно ли легко отсортировать вектор указателей на тип объекта по любому атрибуту этих объектов? - PullRequest
3 голосов
/ 11 марта 2011

Можно ли легко отсортировать вектор указателей типов объектов по любому атрибуту этих объектов?

Скажем, students - это вектор указателей на тип объекта, когда объект student имеет тип Student и имеет два метода student.studentAlias() и student.studentName(). Как я могу отсортировать вектор по псевдонимам?

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

Ответы [ 3 ]

13 голосов
/ 11 марта 2011

Вы можете использовать функтор:

#include <vector>
#include <algorithm>

class StudentAliasComparator
{
public:
    bool operator()(const Student* left, const Student* right) const
    {
        return left->studentAlias() < right->studentAlias();
    }
};

void SortVectorOfStudentByAlias(std::vector<Student*>& students)
{
    std::sort(students.begin(), students.end(), StudentAliasComparator());
}

Вы также можете использовать лямбду либо из буста, либо из языка (если вы используете C ++ 0x).С синтаксисом C ++ 0x это было бы что-то вроде (не могу проверить, поскольку у меня нет доступа к компилятору C ++, который сейчас поддерживает C ++ 0x):

void SortVectorOfStudentByAlias(std::vector<Student*>& students)
{
    std::sort(students.begin(), students.end(),
        [](const Student* l, const Student* r) {
            return l->studentAlias() < r->studentAlias(); })
}
5 голосов
/ 11 марта 2011

Вы можете сортировать с помощью алгоритма std :: sort:

template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);

Просто укажите функциональный объект (комп), который выполняет сравнение по сравнению с интересующим вас атрибутом.

2 голосов
/ 11 марта 2011

Использование std::mem_fun и обертка:

#include <algorithm>
#include <functional>

template <typename F>
struct CompareBy
{
    bool operator()(const typename F::argument_type& x,
                    const typename F::argument_type& y)
    { return f(x) < f(y); }

    CompareBy(const F& f) : f(f) {}

 private:
    F f;
};

template <typename F>
CompareBy<F> by(const F& f) { return CompareBy<F>(f); }

и отсортировать, сделать

std::vector<Student*> students;

std::sort(students.begin(), students.end(), 
          by(std::mem_fun(&Student::studentAlias))
);

Если вы хотите отсортировать по переменным-элементам, к сожалению, нет std::mem_ptr. Используйте идеи из моего ответа там , чтобы создать свой собственный.

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