Сортировка списка произвольного типа - PullRequest
15 голосов
/ 14 ноября 2011

Я хочу иметь stl list объектов, где каждый объект содержит два int. После этого я хочу отсортировать список с помощью stl :: sort после значения первого int. Как мне сказать функции сортировки, что она должна сортироваться после первой int?

Ответы [ 3 ]

29 голосов
/ 14 ноября 2011

Вы можете указать пользовательский предикат сортировки.В C ++ 11 это лучше всего сделать с помощью лямбды:

typedef std::pair<int, int> ipair;
std::list<ipair> thelist;

thelist.sort([](const ipair & a, const ipair & b) { return a.first < b.first; });

В старых версиях C ++ вам нужно написать соответствующую функцию:

bool compFirst(const ipair & a, const ipair & b) { return a.first < b.first; }

thelist.sort(compFirst);

(Вместо этого, если ipairКонечно, вы можете иметь свою собственную структуру данных, просто измените соответствующую функцию сравнения, чтобы получить доступ к соответствующему элементу данных.)

Наконец, если это имеет смысл, вы также можете снабдить свой пользовательский класс operator<.Это позволяет вам свободно использовать класс в любом упорядоченном контексте, но обязательно поймите последствия этого.

3 голосов
/ 14 ноября 2011

std :: list :: sort имеет форму с одним аргументом , причем первый аргумент является функцией сравнения.

1 голос
/ 14 ноября 2011

Вы можете сделать что-то вроде этого:

typedef std::pair<int,int>;
list<my_type> test_list;

bool my_compare (my_type a, my_type b)
{
    return a.first < b.first;
}

test_list.sort(my_compare);

Если бы тип был структурой или классом, он работал бы примерно так:

struct some_struct{
    int first;
    int second;
};

list<some_struct>  test_list;

bool my_compare (const some_struct& a,const some_struct& b)
{
    return a.first < b.first;
}

test_list.sort(my_compare);

Или, альтернативно, вы можете определить operator < для вашей структуры и просто позвоните test_list.sort()

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