STL无序容器之unordered_map

来源:互联网 发布:哈登15 16赛季数据 编辑:程序博客网 时间:2024/04/24 09:04

一、概述

头文件<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;}

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

1 0
原创粉丝点击