如何按键排序 std::list 对?
How to sort std::list of pairs by key?
我想在两个单独的函数中通过 key 以及 value 对 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);
}
};
迭代器必须是随机访问迭代器。 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);
}
};
我想在两个单独的函数中通过 key 以及 value 对 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);
}
};
迭代器必须是随机访问迭代器。 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);
}
};