unordered_map 是关联容器,含有带唯一键的键-值 pair 。搜索、插入和元素移除拥有平均常数时间复杂度。
元素在内部不以任何特定顺序排序,而是组织进桶中。元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
std::unordered_map
满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、无序关联容器 (UnorderedAssociativeContainer) 的要求。
用于构造:哈希表
迭代器
begin,cbegin:返回指向容器第一个元素的迭代器
end,cend:返回指向容器尾端的迭代器
容量
empty:检查容器是否为空
size:返回容纳的元素数
max_size:返回可容纳的最大元素数
修改器
clear:清除内容
insert:插入元素或结点
insert_or_assign:插入元素,或若关键已存在则赋值给当前元素
emplace:原位构造元素
emplace_hint:使用hint就地构造元素
try_emplace:若键不存在则原位插入,若键存在则不做任何事
erase:擦除元素
swap:交换内容
extract:从另一容器释出结点
merge:从另一容器接合结点
查找
at:访问指定的元素,同时进行越界检查
operator[]:访问或插入指定的元素
count:返回匹配特定键的元素数量
find:寻找带有特定键的元素
contains:检查容器是否含有带特定关键的元素
equal_range:返回匹配特定键的元素范围
桶接口
begin(size_type),cbegin(size_type):返回一个迭代器,指向指定的桶的开始
end(size_type),cend(size_type):返回一个迭代器,指向指定的桶的末尾
bucket_count:返回桶数
max_bucket_count:返回桶的最大数量
bucket_size:返回在特定的桶中的元素数量
bucket:返回带有特定键的桶
哈希策略
load_factor:返回每个桶的平均元素数量
max_load_factor:管理每个桶的平均元素数量的最大值
rehash:为至少为指定数量的桶预留存储空间。
这会重新生成哈希表。
reserve:为至少为指定数量的元素预留存储空间。
这会重新生成哈希表。
观察器
hash_function:返回用于对关键哈希的函数
key_eq:返回用于比较键的相等性的函数
//
// Created by LiuHongzhe on 2021/11/11.
//
/*
* 存储无序
*/
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
int main()
{
unordered_map<string,string>hash;
cout<<hash.empty()<<endl;//检查容器是否为空
cout<<hash.size()<<endl;//返回容纳的元素数
cout<<hash.max_size()<<endl;//返回可容纳的最大元素数
hash["key"]="value";
hash["456"]="123";
hash["147"]="258";
for(auto it=hash.begin();it!=hash.end();it++)
{
//返回指向容器第一个元素的迭代器,返回指向容器尾端的迭代器
cout<<it->first<<" ";
cout<<it->second<<" => ";
}
cout<<endl;
hash.insert({"123","789"});//插入元素或结点
for(auto it=hash.begin();it!=hash.end();it++)
{
cout<<it->first<<" ";
cout<<it->second<<" => ";
}
cout<<endl;
hash.erase("123");//擦除元素
for(auto it=hash.begin();it!=hash.end();it++)
{
cout<<it->first<<" ";
cout<<it->second<<" => ";
}
cout<<endl;
cout<<hash.operator[]("147")<<endl;//访问或插入指定的元素
cout<<hash.count("147")<<endl;//返回匹配特定键的元素数量
cout<<hash.find("147")->first<<" "<<hash.find("147")->second<<endl;//寻找带有特定键的元素
hash.clear();//清除内容
cout<<hash.empty()<<endl;
return 0;
}