unordered_map是C++11正式加入的对hash_map的官方实现(之前标准C++没有hash_map的官方实现,我们使用的STL的hash_map并不是官方的)。
从名字可以看出这个结构是无序的,底层设计思想和STL的hash_map一样。元素在内部不以任何特定顺序排序,而是放进桶中。
元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
unordered_map搜索、插入和元素移除拥有平均常数时间复杂度。
unordered_map 容器在头文件中,并位于 std 命名空间中。因此,如果想使用该容器,代码中应包含如下语句:
#include
using namespace std;
template < class Key, //键值对中键的类型
class T, //键值对中值的类型
class Hash = hash<Key>, //容器内部存储键值对所用的哈希函数
class Pred = equal_to<Key>, //判断各个键值对键相同的规则
class Alloc = allocator< pair<const Key,T> > // 指定分配器对象的类型
> class unordered_map;
以上 5 个参数中,必须显式给前 2 个参数传值,并且除特殊情况外,最多只需要使用前 4 个参数,各自的含义和功能如表 1 所示。
(1) 通过调用 unordered_map 模板类的默认构造函数,可以创建空的 unordered_map 容器。比如:
std::unordered_map<std::string, std::string> umap;
由此,就创建好了一个可存储
(2)当然,在创建 unordered_map 容器的同时,可以完成初始化操作。比如:
std::unordered_map<std::string, std::string> umap{
{"Python教程","http://c.biancheng.net/python/"},
{"Java教程","http://c.biancheng.net/java/"},
{"Linux教程","http://c.biancheng.net/linux/"} };
通过此方法创建的 umap 容器中,就包含有 3 个键值对元素。
(4) 另外,还可以调用 unordered_map 模板中提供的复制(拷贝)构造函数,将现有 unordered_map 容器中存储的键值对,复制给新建 unordered_map 容器。
例如,在第二种方式创建好 umap 容器的基础上,再创建并初始化一个 umap2 容器:
std::unordered_map<std::string, std::string> umap2(umap);
由此,umap2 容器中就包含有 umap 容器中所有的键值对。
除此之外,C++ 11 标准中还向 unordered_map 模板类增加了移动构造函数,即以右值引用的方式将临时 unordered_map 容器中存储的所有键值对,全部复制给新建容器。例如:
//返回临时 unordered_map 容器的函数
std::unordered_map <std::string, std::string > retUmap(){
std::unordered_map<std::string, std::string>tempUmap{
{"Python教程","http://c.biancheng.net/python/"},
{"Java教程","http://c.biancheng.net/java/"},
{"Linux教程","http://c.biancheng.net/linux/"} };
return tempUmap;
}
//调用移动构造函数,创建 umap2 容器
std::unordered_map<std::string, std::string> umap2(retUmap());
注意,无论是调用复制构造函数还是拷贝构造函数,必须保证 2 个容器的类型完全相同。
std::unordered_map<std::string, std::string> umap2(++umap.begin(),umap.end());
通过此方式创建的 umap2 容器,其内部就包含 umap 容器中除第 1 个键值对外的所有其它键值对。
unordered_map <string, int> inthash;//定义key为string value是int的map
#include
#include
using namespace std;
int main(){
unordered_map<int, int> intHash;
intHash[1] = 123;
intHash[2] = 456;
intHash[3] = 789;
for (auto it = intHash.begin(); it != intHash.end(); ++it)
cout << " " << it->first << ":" << it->second << endl;
}
查找结果,键值的表示
#include
#include
using namespace std;
int main(){
unordered_map<int, string> strHash;
strHash[12] = "123";
strHash[25] = "456";
strHash[39] = "789";
unordered_map<int, string>::iterator it = strHash.begin();
it = strHash.find(25);//查找结果
if(it != strHash.end()){
cout <<"key:"<<it->first<<",value:"<< it->second << endl;//键值的表示
}else
{
cout << "not find" << endl;
}
}
判断存在次数:
count函数
unordered_map<int, string> strHash
if(strHash.count(0)==0)
{
cout<<"not exist"<<endl;
}
else if(strHash.count(0)>0)
{
cout<<"exist"<<endl;
}
#include
#include
using namespace std;
int main(){
unordered_map<string, string> strHash;
strHash["a"] = "123";
strHash["b"] = "456";
strHash["c"] = "789";
strHash.erase("a");
unordered_map<string, string>::iterator it = strHash.begin();
while (it != strHash.end()){
cout<< it->first <<"\t" << it++->second <<endl;
}
}
参考:
[1] C++ STL unordered_map容器用法详解
[2] C++ unordered_map