📅  最后修改于: 2023-12-03 14:59:47.239000             🧑  作者: Mango
在C++ STL中,Map和Multimap是两个非常有用的容器,它们都是关联式容器(Associative Containers)。它们通过键-值对的方式进行存储,并可以通过键(key)来快速地查询对应的值(value)。Map和Multimap的区别是:Map中每个键只能对应一个值,而Multimap中一个键可以对应多个值。
Map和Multimap中的默认排序是按键的升序排列,但是在实际情况中,我们有时需要进行降序排列。C++ STL提供了一种非常简单的方法来实现这一点。下面是具体的介绍。
在C++ STL中,Map和Multimap的排序方式可以通过第三个模板参数来指定,默认情况下为升序排列,可以指定为std::less
以下是示例代码:
#include <iostream>
#include <map>
int main() {
std::map<int, int, std::greater<int>> myMap;
myMap[1] = 10;
myMap[2] = 20;
myMap[3] = 30;
for (auto& p : myMap) {
std::cout << p.first << " " << p.second << std::endl;
}
return 0;
}
在上面的示例代码中,我们创建了一个Map对象myMap,其中键的类型为int,值的类型也为int。第三个模板参数使用了std::greater
输出结果如下:
3 30
2 20
1 10
可以看到,Map中的键是按降序排列的。
除了使用std::greater
以下是示例代码:
#include <iostream>
#include <map>
#include <functional>
bool Compare(int a, int b) {
return a > b;
}
int main() {
std::map<int, int, std::function<bool(const int&, const int&)>> myMap(Compare);
myMap[1] = 10;
myMap[2] = 20;
myMap[3] = 30;
for (auto& p : myMap) {
std::cout << p.first << " " << p.second << std::endl;
}
return 0;
}
在上面的示例代码中,我们定义了一个自定义比较函数Compare,它的作用是将两个int类型的参数进行比较,返回较大的那个数。
然后我们创建了一个Map对象myMap,指定了第三个模板参数为std::function<bool(const int&, const int&)>,并将自定义比较函数作为构造参数传入。
输出结果如下:
3 30
2 20
1 10
同样可以看到,键是按降序排列的。
除了Map之外,Multimap也可以进行降序排列。Multimap与Map的区别在于:Map中一个键只能对应一个值,而Multimap中一个键可以对应多个值。
以下是示例代码:
#include <iostream>
#include <map>
int main() {
std::multimap<int, int, std::greater<int>> myMultiMap;
myMultiMap.insert(std::make_pair(1, 10));
myMultiMap.insert(std::make_pair(2, 20));
myMultiMap.insert(std::make_pair(3, 30));
myMultiMap.insert(std::make_pair(3, 40));
for (auto& p : myMultiMap) {
std::cout << p.first << " " << p.second << std::endl;
}
return 0;
}
在上面的示例代码中,我们创建了一个Multimap对象myMultiMap,其中键的类型为int,值的类型也为int。第三个模板参数使用了std::greater
此外,由于Multimap中一个键可以对应多个值,我们在插入键值对时使用了insert函数,并将键值对封装成std::pair对象。
输出结果如下:
3 30
3 40
2 20
1 10
可以看到,键是按降序排列的,如果键相同,则值按插入的顺序输出。
在C++ STL中,Map和Multimap的降序排列非常简单,可以通过指定第三个模板参数为std::greater
// 示例代码
#include <iostream>
#include <map>
int main() {
std::map<int, std::string, std::greater<int>> myMap;
myMap[1] = "C++";
myMap[2] = "STL";
myMap[3] = "Map";
for (auto& p : myMap) {
std::cout << p.first << " " << p.second << std::endl;
}
return 0;
}
// 输出结果
3 Map
2 STL
1 C++