Как отсортировать std::list пар по ключу?

Я хотел бы отсортировать std::list<std::pair<string, int>> по ключу, а также по значению в двух отдельных функциях.

Я получаю сообщение об ошибке:

error: reference to non-static member function must be called
    sort(test.begin(), test.end(), sortByVal);

Код

class Test 
{
    std::list<pair<std::string, int>> test;

public:
    void sortbykey()
    {
        sort(test.begin(), test.end(), sortByVal);
    }

    bool sortByVal(const std::pair<std::string, int>& a, const std::pair<std::string, int>& b)
    {
        return (a.first < b.first);
    }
};


person jun    schedule 12.06.2020    source источник
comment
Пожалуйста, не описывайте код, вместо этого предоставьте минимальный воспроизводимый пример. Если у вас есть проблемы с членами класса, поместите их в класс в коде.   -  person Yksisarvinen    schedule 13.06.2020
comment
Отвечает ли это на ваш вопрос? почему функция сортировки STL не работает?   -  person Roland Schulz    schedule 13.06.2020


Ответы (3)


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


С другой стороны, std::list имеет функцию-член std::list<T>::sort, которая будет предпочтительным, если вы настаиваете на том, что контейнер должен быть std::list.

Поскольку вам нужно отсортировать по first пар, вам нужно передать ему собственный компаратор (или лямбда).

Это означает, что вам нужно

void sortbykey()
{
    test.sort([](const auto& lhs, const auto& rhs) { return lhs.first < rhs.first; });
}
person JeJo    schedule 12.06.2020

Итератор должен быть итератором с произвольным доступом. list-итератор не является.

person Roland Schulz    schedule 12.06.2020
comment
Превосходно! А функция сравнения должна быть статической или автономной, как объяснил Пол. - person Christophe; 13.06.2020

Вы можете использовать std::vector и сделать функцию сравнения статической

#include <algorithm>
#include <string>
#include <vector>

class Test {
    std::vector<std::pair<std::string, int>> test;

  public:
    void sortbykey() {
        sort(test.begin(), test.end(), sortByVal);
    }

    static bool sortByVal(const std::pair<std::string, int> &a,
                          const std::pair<std::string, int> &b) {
        return (a.first < b.first);
    }
};
person Ayman Al-Qadhi    schedule 12.06.2020