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 insertion
myrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertion
myrecipe.insert(mypantry.begin(), mypantry.end()); // range insertion
myrecipe.insert({ {"sugar",0.8},{"salt",0.1} }); // initializer list insertion
return 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 iterator
mymap.erase("France"); // erasing by key
mymap.erase(mymap.find("China"), mymap.end()); // erasing by range
return 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的值是唯一的文章来源:https://www.toymoban.com/news/detail-759196.html
一般在unordered_multimap中用的较多文章来源地址https://www.toymoban.com/news/detail-759196.html
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[ ]中实际进行插入查找
到了这里,关于【C++】: unordered_map的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!