C++语法—— STL:unordered_map

一.介绍

1.1介绍

unordered_map是C++11正式加入的对hash_map的官方实现(之前标准C++没有hash_map的官方实现,我们使用的STL的hash_map并不是官方的)。
从名字可以看出这个结构是无序的,底层设计思想和STL的hash_map一样。元素在内部不以任何特定顺序排序,而是放进桶中。
元素放进哪个桶完全依赖于其键的哈希。这允许对单独元素的快速访问,因为一旦计算哈希,则它准确指代元素所放进的桶。
unordered_map搜索、插入和元素移除拥有平均常数时间复杂度。

1.2头文件和结构定义
   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 所示。

C++语法—— STL:unordered_map_第1张图片

二.应用

2.1初始化

(1) 通过调用 unordered_map 模板类的默认构造函数,可以创建空的 unordered_map 容器。比如:

std::unordered_map<std::string, std::string> umap;

由此,就创建好了一个可存储 类型键值对的 unordered_map 容器。

(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 个容器的类型完全相同。

  1. 当然,如果不想全部拷贝,可以使用 unordered_map 类模板提供的迭代器,在现有 unordered_map 容器中选择部分区域内的键值对,为新建 unordered_map 容器初始化。例如:
    //传入 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
2.2遍历
#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;
}

2.3查找

查找结果,键值的表示

#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;
}
2.4删除
#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

你可能感兴趣的:(刷题,c++,开发语言,1024程序员节)