STL无序容器之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,                       // unordered_map::hasher
           class Pred = equal_to,                   // 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
#include
#include
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;
}

实验结果:
STL无序容器之unordered_map_第1张图片

你可能感兴趣的:(STL)