STL无序容器之unordered_map
一、概述头文件<unordered_map>定义了unordered_map和unordered_multimap容器。这个是C++11新特性,以前的编译器不支持。unordered_map类模版定义如下:template < class Key,// unordered_map::key_typecla
·
一、概述
头文件<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)