一、map自定义排序规则
map中存储的是key-value键值对,默认按照key值从小到大顺序排序。即map只能按照key排序。
pair的排序规则才是先按照key排,再按照value排序。
map<int, string> numAndPosMap{
{ 1, "aaa" },
{ 3, "bbb" },
{ 5, "ccc" },
{ 2, "ddd" },
{ 4, "eee" },
};
1 aaa
2 ddd
3 bbb
4 eee
5 ccc
1. 默认排序规格
std标准库中带有less<>
和greater<>
排序规则。
- 指定less排序
map<int, string, less<int>> numAndPosMap{
{ 1, "aaa" },
{ 3, "bbb" },
{ 5, "ccc" },
{ 2, "ddd" },
{ 4, "eee" },
};
1 aaa
2 ddd
3 bbb
4 eee
5 ccc
- 指定greater排序
map<int, string, greater<int>> numAndPosMap{
{ 1, "aaa" },
{ 3, "bbb" },
{ 5, "ccc" },
{ 2, "ddd" },
{ 4, "eee" },
};
5 ccc
4 eee
3 bbb
2 ddd
1 aaa
2. 修改按key排序规格
当key为自定义数据时,默认的排序规则就会失效,需要重写针对自定义数据的排序规则。
- 在数据结构内重载比较运算符
struct MyKey {
int num;
string name;
bool operator< (const MyKey& key) const
{
if (name < key.name) {
return true;
} else if (name > key.name) {
return false;
}
return num < key.num;
}
};
using KeyType = MyKey;
template<typename T>
void ShowVectorElem(T elems)
{
cout << "size: " << elems.size() << endl;
for (const auto& elem : elems) {
cout << elem.first.num << " " << elem.first.name << " " << elem.second << endl;
}
}
int main()
{
map<KeyType, string, less<KeyType>> numAndPosMap{
{ { 1, "aaa" }, "ee"},
{ { 3, "bbb" }, "dd"},
{ { 5, "ccc" }, "cc"},
{ { 2, "ddd" }, "bb"},
{ { 4, "eee" }, "aa"},
};
ShowVectorElem(numAndPosMap);
return 0;
}
1 aaa ee
3 bbb dd
5 ccc cc
2 ddd bb
4 eee aa
- 重新写排序函数
struct MyKey {
int num;
string name;
};
using KeyType = MyKey;
ostream& operator<< (ostream& out, const MyKey& key)
{
out << key.num << " - " << key.name;
return out;
}
template<typename T>
void ShowVectorElem(T elems)
{
cout << "size: " << elems.size() << endl;
for (const auto& elem : elems) {
cout << elem.first << " " << elem.second << endl;
}
}
int main()
{
auto cmp = [](const KeyType& a, const KeyType& b){
if (a.name < b.name) {
return true;
} else if (a.name > b.name) {
return false;
}
return a.num < b.num;
};
map<KeyType, string, decltype(cmp)> numAndPosMap(cmp);
numAndPosMap.insert({ { 1, "aaa" }, "ee"});
numAndPosMap.insert({ { 3, "bbb" }, "dd"});
numAndPosMap.insert({ { 5, "ccc" }, "cc"});
numAndPosMap.insert({ { 2, "ddd" }, "bb"});
numAndPosMap.insert({ { 4, "eee" }, "aa"});
ShowVectorElem(numAndPosMap);
return 0;
}
size: 5
1 - aaa ee
3 - bbb dd
5 - ccc cc
2 - ddd bb
4 - eee aa
3. 修改按value排序规则
map没有随机迭代器,不能使用sort
函数。如果需要对value排序,可以再建立一个以value为key的map(类似双映射)。
或者将map数据导入到可以使用sort的容器中,如vector中。