生成 unordered_map 容器和生成 map 一样简单,只要可以用 hash<K> 的实例哈希 k 类型的键,而且必须能够用 == 运算符来比较键。下面展示了如何定义和初始化 unordered_map:

std::unordered_map<std::string, size_t> people {{"Jan",44}, {"Jim", 33}, {"Joe", 99}}; // Name,age

这样就生成了一个包含 pair<string,size_t> 元素的容器,并用初始化列表中的元素对它进行了初始化。容器中格子的个数是默认的,它使用 equal_to<String>() 对象来判断键是否相等。它会用定义在 string 头文件中的 hash<string> 来对 string 进行哈希。如果没有提供初始值,默认的构造函数会生成一个空容器,它有默认个数的格子。

当我们知道要在容器中保存多少个元素时,可以在构造函数中指定应该分配的格子的个数:

std::unordered_map<std::string,size_t> people {{ { "Jan", 44}, {"Jim", 33}, {"Joe", 99}}, 10};

这个构造函数有两个参数:初始化列表和需要分配的格子数。

也可以用迭代器定义的一段 pair 对象来生成容器。显然,只要这个范围内的 pair 对象都是要求的类型,那么任何对象源都可以接受。例如:

std::vector<std::pair<string, size_t>>folks {{ "Jan",44}, {"Jim", 33}, {"Joe", 99},{"Dan", 22},{"Ann", 55}, {"Don", 77}};
std::unordered_map<string, size_t> neighbors {std::begin(folks), std::end(folks) , 500};

folks 是一个包含 pair<string,size_t> 类型元素的 vector 容器,然后用它的元素来填充 neighbors 容器。这里为 neighbors 分配了 500 个格子,但也可以省略这个参数,使用默认的格子个数。可以为前面的两个构造函数指定定义哈希函数的函数对象。这个函数对象会分别作为第 1 个构造函数的第 3 个参数,以及第 2 个构造函数的第 4 个参数,所以这时需要为第 2 个构造函数指定格子个数。接下来会展示如何在接收初始化列表的构造函数中指定这个参数。

假如我们想要用定义在前面章节中的 Name 对象作为键,那就必须为它定义一个哈希函数和一个恒等运算符,扩展后的类的定义如下:

class Name
{
public:
size_t hash() const { return std::hash<std::string>()(first+second); }
bool operator==(const Name& name) const { return first == name.first && second== name.second; }
};

在这个示例中,编译器提供的默认的 operator==() 成员函数能够满足我们的要求,但还是想自己定义。成员函数 hash() 用函数对象 hash<string>() 来哈希 Name 对象的成员 first 和 second 所拼接的字符串。

unordered_map 容器的哈希函数只能接受和键同类型的单个参数,它会返回一个 size_t 类型的哈希值。我们可以定义一个满足这些条件的函数对象的类型,这个类型的函数对象会调用 Name 对象的成员函数 hash():

class Hash_Name {
public:
size_t operator()(const Name& name) const { return name.hash(); }
};

当生成 unordered_map 容器时,可以用 Hash_Name 对象作为它的比较函数:

std::unordered_map<Name, size_t, Hash_Name> people
{{{{"Ann", "Ounce"}, 25}, {{"Bill", "Bao"}, 46}, {{"Jack", "Sprat"}, 77}},500,Hash Name()}

这个容器中的元素是 pair<Name, size_t> 类型对象。它的构造函数的第一个参数是一个初始化列表,里面定义了三个这种类型的对象。注意括号是如何嵌套的。最内层的括号中包含 Name 构造函数的参数。它上面的一层包含的是 pair<Name,size_t> 构造函数的参数。

unordered_map 构造函数的第 2 个参数是格子的个数,我们必须指定它,因为我们想使用第 3 个参数,第 3 个参数是用来哈希键的函数对象。Hash_Name 类型的函数对象会作为这个容器的第 3 个模板类型参数。这么做是必要的,因为模板类型参数有一个不同于我们函数对象的类型的默认值。unordered_map 有以元素段为参数的构造函数,它的前两个参数是迭代器,第 3 个参数是格子个数,第 4 个参数是哈希函数。

当需要指定用来比较两个键对象是否相等的函数对象时,必须指定格子个数,函数对象会用键值来生成哈希值。如果我们忽略了 Name 类的成员函数 operator==(),并且假设定义了一个定义了函数对象的类类型 Name_Equal,可以按如下方式在构造函数中指定它:

std::unordered_map<Name, size_t, Hash_Name, Name_Equal〉 people
{ { { {"Ann", "Ounce"}, 25}, {{"Bill”, "Bao"}, 46},{{"Jack","Sprat"}, 77}},500,Hash_Name(), Name_Equal()};

这里有一个额外的模板类型参数和一个额外的构造函数参数,因为参数有默认值,所以这个模板类型参数是必要的。模板参数列表中用来比较键的函数对象同样会用在以初始化列表为参数的构造函数中。

unordered_map 也有移动和拷贝构造函数。显然,可以用它们生成容器的副本,副本容器的格子个数、哈希函数都和参数容器相同。

C++ unordered_map初始化相关推荐

  1. leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

    目录 1.传引用 2.vector使用 初始化方法 常用成员函数 3.字符串string 初始化方法 常用成员函数 4.哈希表 unordered_map 初始化 常用成员函数 示例:计数器 5.哈希 ...

  2. STL教程:C++ STL快速入门

    目录 1.STL引言 2.STL是什么(STL简介) 3.STL历史 4.STL组件 5.STL基本结构 6.STL 使用方法 7.STL目录 网址:STL教程:C++ STL快速入门(非常详细) 第 ...

  3. LeetBook哈希表专题题解(详解/一题多解)

    哈希表 文章目录 哈希表 设计哈希表 设计哈希集合(set) (超大数组法) (拉链法1(list实现)) (拉链法2(模拟实现单链表+虚拟头节点)) (拉链法3(模拟单链表不叫虚拟头节点)) 设计哈 ...

  4. C_plus_侯捷课件笔记

    大气的编程 文章目录 大气的编程 complex例子 创建一个类需要注意: 标准库(#include) 头文件标准形式: 声明(类定义) 构造函数 class template (类模板): 操作符重 ...

  5. week11——作业(水题+背包问题)

    目录 买房子: 问题描述 题目简述 输入/输出格式 样例 问题分析 解题思路 参考代码 心得体会 排方阵: 问题描述 题目简述 输入/输出格式 样例 问题分析 解题思路 参考代码 心得体会 凯撒密码: ...

  6. c、c++ 常用API汇总

    前言 本文汇总c.cpp里常用API,会持续更新,便于查阅. C语言部分参考:C语言 基础知识整理 <string.h> 传入此类函数的指针必须是以空字符为结尾的. char *strch ...

  7. C++11 unordered_map详细介绍

    整理的算法模板合集: ACM模板 目录: 1.介绍 1.1 特性 2. 模版 2.1 迭代器 3. 功能函数 3.1 构造函数 3.2 容量操作 3.2.1 size 3.2.2 empty 3.3 ...

  8. C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)

    一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...

  9. 【数据结构笔记】B树和B+树的实现,哈希查找,STL中的hash_map和unordered_map容器用法

    B和B+树 哈希查找 用开放定址法解决哈希冲突的哈希查找算法 链地址法: 利用哈希表查找一个字符串中第一个只出现一次的字符 hash_map和unordered_map 设计算法删除重复的元素 设计算 ...

  10. map unordered_map hash_map的查找性能测试

    结论如下: Release模式下: 1. 容量为10的时候,查找效率:map > unordered_map > hash_map 2. 容量为100的时候,查找效率:map = unor ...

最新文章

  1. 重走丝绸之路:海尔如何探索全球生活智慧?
  2. 纯干货:如何高效的进行需求管理?
  3. 【增强】批次特性增强案例
  4. 基于struts2+hibernate+spring(ssh2)的登录验证码的实现
  5. 一键转发抢红包源码及搭建教程
  6. Cli4.5.x 中使用axios请求数据
  7. 小区重选优先级_NR小区重选理论研究
  8. 部署SCOM2012 SP1
  9. 在线json解析工具 在线js解析加密混合工具
  10. 在Linux上安装chisel bootcamp遇到的各种问题
  11. IAR for stm8安装破解
  12. 诺基亚系列手机型号命名研究(转)
  13. 经典论文复现|手把手带你复现ICCV 2017经典论文—PyraNet
  14. Centos7.5下pip安装第三方库时出现提示:You are using pip version 8.1.2, however version 10.0.1 is available.
  15. i.MX8MPlus中的CLK子系统
  16. 联发科技一道笔试题目
  17. 看10遍教程不如写一遍代码--HTML入门demo小结
  18. 理解tfrecord读取数据——错误OutOfRangeError (see above for traceback)的解决
  19. leetcode算法算题记录-数组--快慢指针
  20. 容易遗忘的单词(一)

热门文章

  1. 关于winfrom中如何快速导出DataGridView数据到excel中的问题
  2. unity3d改变物体的中心位置_Unity3d粒子特效:制作火焰效果
  3. win 7更改计算机用户名和密码错误,win7系统一开机就显示用户名和密码错误故障的解决方法...
  4. linux下启动管理,rEFInd启动管理器配置文件详解
  5. 计算机网络传输介质中速率最快的是,通常传输速率最快的网络类型是()
  6. 小程序开发者服务器设计,微信小程序的设计思路和理念
  7. java的类加载器体系结构和双亲委派机制
  8. LOJ #6268. 分拆数
  9. 反射认识_03_改变成员变量Fields
  10. iis7部署WCF服务应用程序