1、概念
- key
键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。
- T
映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。
- Hash
一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型的唯一值。这可以是一个实现函数调用操作符的类,也可以是一个指向函数的指针(参见构造函数)。默认为hash<Key>。
- Pred
接受两个键类型参数并返回bool类型的二进制谓词。表达式pred (a, b), pred是这种类型的一个对象,a和b是键值,返回true,如果是应考虑相当于b。这可以是一个类实现一个函数调用操作符或指向函数的指针(见构造函数为例)。这默认为equal_to<Key>,它返回与应用相等操作符(a==b)相同的结果。
- Allloc
用于定义存储分配模型的allocator对象的类型。默认情况下,使用allocator类模板,它定义了最简单的内存分配模型,并且与值无关。
- unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。
- 在unordered_map中,键值通常用于唯一的标识元素(键值是唯一的),而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
- 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
- unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭 代方面效率较低。
- unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。
2、构造函数
(1)创建空的unordered_map
unordered_map<int, int> m;
(2)使用初始化列表初始化
unordered_map<int, int> m1({ { 1,1 } });unordered_map<int, int> m2({{ 1,1 },{ 2,2 },{ 3,3 }});
(3)拷贝构造函数初始化
unordered_map<int, int> m3(m2);
(4)迭代器初始化
unordered_map<int, int> m4(m2.begin(),m2.end());
3、内置函数
3.1、容量
(1)判空(返回bool值)
unordered_map<int, int> m;cout << m.empty();
(2)求大小
unordered_map<int, int> m;m.size();
(3)返回无序映射容器可以容纳的最大元素数。
unordered_map<int, int> m;cout << m.max_size();
3.2、迭代器
unordered_map<int, int> v;v.begin(); //获取第一个数的位置v.end(); //获取最后一个数的位置unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}
3.3、元素访问
unordered_map<string, string> mymap;mymap["Bakery"] = "Barbara"; mymap["Seafood"] = "Lisa"; mymap["Produce"] = "John"; string name = mymap["Bakery"]; mymap["Seafood"] = name;mymap["Bakery"] = mymap["Produce"];name = mymap["Deli"]; mymap["Produce"] = mymap["Gifts"];
3.4、修改器
(1)emplace(插入)
unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));
(2)insert(插入)
使用和emplace类似,但是更加灵活
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, double>myrecipe,mypantry = { {"milk",2.0},{"flour",1.5} };pair<string, double> myshopping("baking powder", 0.3);myrecipe.insert(myshopping); // copy insertionmyrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertionmyrecipe.insert(mypantry.begin(), mypantry.end()); // range insertionmyrecipe.insert({ {"sugar",0.8},{"salt",0.1} }); // initializer list insertionreturn 0;
}
(3)erase(删除)
#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, string> mymap;// populating container:mymap["U.S."] = "Washington";mymap["U.K."] = "London";mymap["France"] = "Paris";mymap["Russia"] = "Moscow";mymap["China"] = "Beijing";mymap["Germany"] = "Berlin";mymap["Japan"] = "Tokyo";// erase examples:mymap.erase(mymap.begin()); // erasing by iteratormymap.erase("France"); // erasing by keymymap.erase(mymap.find("China"), mymap.end()); // erasing by rangereturn 0;
}
(4)clear(清空)
(5)swap (交换)
3.5、查找
(1)find(返回迭代器)
unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.find(2);while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}
(2)count(计数)
一般在unordered_map中用不到,因为unordered_map中key的值是唯一的
一般在unordered_multimap中用的较多
4、unordered_map的遍历(迭代)
4.1、迭代器
unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}
4.2、范围for
for (auto e : m){cout << e.first << " " << e.second << endl;}
总结
- unordered_map中的的元素是键值对
- unordered_map中的key是唯一的,并且不能修改
- unordered_map遍历是一个无需的数列
- unordered_map的底层为哈希结构
- 支持[ ]操作符,operator[ ]中实际进行插入查找