如何按键排序 std::list 对?

How to sort std::list of pairs by key?

我想在两个单独的函数中通过 key 以及 valuestd::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);
    }
};

迭代器必须是随机访问迭代器。 list-迭代器不是。

std::sort required to have the iterator passed to be Legacy Random AccessIterator. But the std::list has Legacy Bidirectional Iterator,就是这个错误的原因。


另一方面,std::list 有一个成员函数 std::list<T>::sort,如果您坚持容器必须是 std::list.[=19,这将是首选方式=]

由于您需要按对的 first 进行排序,因此您需要将自定义比较器(或 lambda)传递给它。

意味着你需要

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

您可以使用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);
    }
};