std::map 是有序的键值对容器,map中的元素是自动按Key(键)升序排序。
它的元素的键是唯一的。可以用比较函数 Compare 自定义排序。map的内部实现通常为红黑树。
代码:
下面分别演示std::map的 增、删、改、查、迭代器使用、auto关键字使用、以及自定义排序规则。
#include <iostream>
#include <map>
using namespace std;
//自定义比较类
class MyCompare
{
public:
//降低理解难度,暂时不使用函数模板
bool operator()(const int &lnum, const int &rnum) const {
return lnum > rnum;
}
};
typedef map<string, string> MyMap;
typedef map<int, string, MyCompare> MyCompareMap;
//重载,暂时不使用函数模板
void printf_myMap(const MyMap &map) {
auto mapIter = map.begin();
for (; mapIter != map.end(); mapIter++) {
cout << mapIter->first.c_str() << "->" << mapIter->second.c_str() << endl;
}
}
void printf_myMap(const MyCompareMap &map) {
auto mapIter = map.begin();
for (; mapIter != map.end(); mapIter++) {
cout << mapIter->first << "->" << mapIter->second.c_str() << endl;
}
}
int main()
{
MyMap mymap;
//插入方法1
mymap["1"] = "稻香";
mymap["1"] = "青花瓷"; //青花瓷替换了稻香,没有稻香了
//插入方法2
mymap.insert(pair<string, string>("3", "彩虹"));
mymap.insert(pair<string, string>("4", "夜曲"));
//插入方法3
mymap.insert(MyMap::value_type("6", "晴天"));
mymap.insert(MyMap::value_type("6", "蜗牛")); //蜗牛insert不进去了,因为已经有6了
printf_myMap(mymap);
cout << "----------------我是分割线----------------" << endl;
MyMap::iterator iter;
//查找
iter = mymap.find("6");
if (iter != mymap.end()) {
cout << "find is=" << iter->second.c_str() << endl;
//删除
iter = mymap.erase(iter);
}
printf_myMap(mymap);
cout << "----------------我是分割线----------------" << endl;
//修改
mymap["1"] = "七里香";
mymap["2"] = "东方破";
printf_myMap(mymap);
cout << "----------------自定义排序----------------" << endl;
//这次我们按降序 来输出 map中的元素
MyCompareMap myCompareMap;
myCompareMap[1] = "james";
myCompareMap[3] = "curry";
myCompareMap[99] = "harden";
myCompareMap[5] = "durant";
printf_myMap(myCompareMap);
getchar();
return 0;
}
以上写的三种用法,虽然都可以实现数据的插入,但是它们是有区别的,
当然pair<string, string>和MyMap::value_type效果是一样的。
但是用insert函数插入数据,在数据的插入上涉及到集合的唯一性的概念,
即当map中已经有这个关键字时,insert操作是无效的,
但是用数组方式如mymap["1"] = "稻香";就不同了,它可以覆盖以前关键字对应的值。
输出: