一、概述

头文件<unordered_map>定义了unordered_map和unordered_multimap容器。这个是C++11新特性,以前的编译器不支持。unordered_map类模版定义如下:

template < class Key,                                    // unordered_map::key_type
           class T,                                      // unordered_map::mapped_type
           class Hash = hash<Key>,                       // unordered_map::hasher
           class Pred = equal_to<Key>,                   // unordered_map::key_equal
           class Alloc = allocator< pair<const Key,T> >  //unordered_map::allocator_type
           > class unordered_map;

其中Key是map的键值类型,T是mapped value的值类型,Hash是容器底层存储用的哈希函数对象,Pred是判断键值是否相等的bool函数,Alloc是内存空间配置器。
在unordered_map中,键值可以唯一确定一个与之相关联的数值。unordered_map中的元素存储既不以key为序,也不以mapped_value为序,但是都依据其hash值存储在桶里。unordered_map存取单个元素要比map更快。

二、成员函数

操作说明
operator=赋值操作
empty()判断容器是否为空
size()返回容器存储元素数量
max_size()返回容器最大存储容量
begin()返回一个前向迭代器,指向第一个元素的位置
end()返回一个迭代器,指向最后一个元素的下一个位置
cbegin()返回一个逆向迭代器,指向逆序第一个元素的位置
cend()返回一个逆序迭代器,指向逆序最后一个元素的下一个位置
operator[]根据键值直接存取元素,若键值不存在,则插入之
at()同上,不过不会插入新的键值,而是抛出out_of_range异常
find()根据键值进行查找,找到返回所在迭代器,否则返回end迭代器
count()计算容器内对应键值的数量,返回结果非1即0
equal_range()返回键值相等的区间,找到返回迭代器对,值均为参数键值对应的迭代器;找不到返回两个end
emplace()构造键值对,并插入容器内
insert()插入键值对,支持拷贝插入,区间插入
erase()移除元素,可传迭代器参数,键值参数,迭代器区间参数
clear()清除容器内所有元素
swap()交换两个容器内的元素


关于unordered_map的说明及成员函数的使用,参见C++参考手册

三、示例代码

//hash_map的使用
#include<iostream>
#include<hash_map>
#include<cstring>
using namespace std;

struct eqstr
{
    bool operator()(const char* s1, const char* s2) const {
        return strcmp(s1, s2) == 0;
    }
};
int main()
{
    hash_map<const char*, int> days;

    days["january"] = 31;
    days["february"] = 28;
    days["march"] = 31;
    days["april"] = 30;
    days["may"] = 31;
    days["june"] = 30;
    days["july"] = 31;
    days["august"] = 31;
    days["september"] = 30;
    days["october"] = 31;
    days["november"] = 30;
    days["december"] = 31;

    cout << "september -> " << days["september"] << endl;
    cout << "june -> " << days["june"] << endl;
    cout << "february -> " << days["february"] << endl;
    cout << "december -> " << days["december"] << endl;

    hash_map<const char*, int>::iterator ite1 = days.begin();
    hash_map<const char*, int>::iterator ite2 = days.end();
    for (; ite1 != ite2; ++ite1)
        cout << ite1->first << ' ';

    cout << endl;

    if (days.find("january") != days.end())
        cout << "january has " << days.find("january")->second << "days!" << endl;

    return 0;
}

实验结果:
这里写图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐