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

问题描述 投票:2回答:3

我想对一个 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);
    }
};

c++ sorting c++-standard-library std-pair stdlist
3个回答
3
投票

std::sort 需要将迭代器传递给是 传统的随机存取器. 但是 std::list传统的双向迭代器,所以才会出现错误。


另一方面 std::list 有一个成员函数 std::list<T>::sort如果您坚持认为容器必须是 "无 "的,那么最好的办法是 "无"。std::list.

由于你需要按 first 的对,你需要传递一个自定义的比较器(或lambda)给它。

也就是说,你需要

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

2
投票

迭代器必须是一个随机访问迭代器。A list-iterator不是。


2
投票

你可以使用 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);
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.