我想对一个 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);
}
};
在 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; });
}
迭代器必须是一个随机访问迭代器。A list
-iterator不是。
你可以使用 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);
}
};