简介
序列容器不提供方便的数据访问机制,相比而言,map容器提供了一种更高效的存储和访问数据的方法。
map容器是关联容器的一种。在关联容器中,元素的位置取决于和它关联的键的值。
map容器的元素是pair<const K,T >类型的对象,这种对象封装了一个T类型对象和一个与其关联的K类型的键。
map<K,T>
容器
头文件:#include <map>
特点:每个键都是唯一的,可以保存重复的对象,只要他们的键不同。容器中的元素都是有序的。
元素组织形式:红黑树(一种适度平衡的二叉搜索树,最长路径与最短路径不能相差2倍以上)
multimap<K,T>
容器
头文件:#include <multimap>
特点:允许使用重复的键,除此以外和狭义的map容器没什么不同
元素组织形式:红黑树
unordered_map<K,T>
容器
头文件:#include <unordered_map>
特点:元素的顺序不是直接由键值决定的,而是由键值的哈希值决定的。哈希值是由键值通过哈希函数生成的整数。该容器不允许重复的键。
元素组织形式:散列表
unordered_multimap<K,T>
容器
头文件:#include <unordered_multimap>
特点:该容器允许重复的键。除此以外和unorder_map容器没什么不同。
元素组织形式:散列表
基本操作
1.创建map容器
std::map<std::string , size_t> people;
//或者通过初始化列表
std::map<std::string , size_t> people{ { "anna", 26} ,{"Bill" , 43} };
// utility头文件定义了 make_pair<T1,T2>() 函数模版
std::map<std::string, size_t> people { std::make_pair(" Jack" ,33), std::make_pair("bill" ,32)};
//通过复制构造函数
std::map<std::string , size_t> personnel{people};
std::map<std::string , size_t> personnel(people);
//通过另一个容器的一段元素来创建
std::map<std::string , size_t> personnel {people.begin(), people.end()}
2.插入元素
auto pr = people.insert({"sdgg", 34}); // 返回的pr是这样一个对象,它的成员变量 first 是新插入元素的迭代器, 成员变量second 是一个布尔值,如果插入成功则返回true
people["banny"] = 32; // 如果没有banny这个键,则添加这个键
3.就地构造元素
在map 的适当位置直接构造新元素,避免复制和移动操作
std::map<std::string , size_t> people;
auto pr = people.emplace( {"jack",33}); // 此处的pr 和insert() 返回的对象是一样的
4.访问元素
auto Jack = people.at("jack"); // 返回的是“Jack”词条下对应的数值 ,如果jack 不存在则返回异常
auto jack = people["jack"] ; // 如果jack不存在则返回0 ,同时插入了一个键值对,{“jack” , 0}
5.检索元素
auto iter = people.find("jack") ; // 返回的是jack位置的迭代器,如果没有jack 则返回 people.end()
cout << iter->first << " " <<iter->second <<endl;
输出: jack 33
auto a = people.count("jack"); // 对其中的jack 计数,返回数量,
6.删除元素
people.erase("jack"); //移除键和参数匹配的元素,然后返回移除元素的个数
people.erase(++people.begin(), --people.end()) ; // 移除两个迭代器参数所定义范围的元素,此句删除除首尾以外的所有参数, 返回被移除的最后一个元素的下一个位置
people.clear() ; // 删除所有元素