1.介绍

unordered_map是一个关联容器,内部采用的是hash表结构,拥有快速检索的功能。

1.1 特性

关联性:通过key去检索value,而不是通过绝对地址(和顺序容器不同)
无序性:使用hash表存储,内部无序
Map : 每个值对应一个键值
键唯一性:不存在两个元素的键一样
动态内存管理:使用内存管理模型来动态管理所需要的内存空间

1.2 Hashtable和bucket

由于unordered_map内部采用的hashtable的数据结构存储,所以每个特定的key会通过一些特定的哈希运算映射到一个特定的位置,我们知道,hashtable是可能存在冲突的(多个key通过计算映射到同一个位置),在同一个位置的元素会按顺序链在后面。所以把这个位置称为一个bucket是十分形象的(像桶子一样,可以装多个元素)。

所以unordered_map内部其实是由很多哈希桶组成的,每个哈希桶中可能没有元素,也可能有多个元素。

2. 模版

 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;

主要使用的也是模板的前2个参数<键,值>

 unordered_map<const Key, T> map;

2.1 迭代器

unordered_map的迭代器是一个指针,指向这个元素,通过迭代器来取得它的值。

 unordered_map<Key,T>::iterator it;
(*it).first; // the key value (of type Key)
(*it).second; // the mapped value (of type T)
(*it); // the "element value" (of type pair<const Key,T>)

它的键值分别是迭代器的first和second属性。

 it->first;               // same as (*it).first   (the key value)
it->second; // same as (*it).second (the mapped value)

3. 函数

3.1 构造函数

unordered_map的构造方式有几种:

  • 构造空的容器
  • 复制构造
  • 范围构造
  • 用数组构造

运行结果:

3.2 容量操作

3.2.1 size

 size_type size() const noexcept;

返回unordered_map的大小。

3.2.2 empty

 bool empty() const noexcept;
  • 为空返回true
  • 不为空返回false,和用size() == 0判断一样。

3.3 元素操作

3.3.1 find

 iterator find ( const key_type& k );          // 根据key获取value

查找key所在的元素。

  • 找到:返回元素的迭代器。通过迭代器的second属性获取值。
  • 没找到:返回unordered_map::end。

3.3.2 insert

插入有几种方式:

  • 复制插入(复制一个已有的pair的内容)
  • 数组插入(直接插入一个二维数组)
  • 范围插入(复制一个起始迭代器和终止迭代器中间的内容)
  • 数组访问模式插入(和数组的[]操作很相似)

具体的例子可以看后面示例代码。

3.3.3 at

 mapped_type& at ( const key_type& k );       //根据key获得value

查找key所对应的值

  • 如果存在:返回key对应的值,可以直接修改,和[]操作一样。
  • 如果不存在:抛出 out_of_range 异常.

mymap.at(“Mars”) = 3396; //mymap[“Mars”] = 3396

3.3.4 erase

擦除元素也有几种方式:

  • 通过位置(迭代器)
 iterator erase ( const_iterator position );
  • 通过key
 size_type erase ( const key_type& k );
  • 通过范围(两个迭代器)
 iterator erase ( const_iterator first, const_iterator last );

3.3.5 clear

 void clear() noexcept

清空unordered_map

3.3.6 swap

 void swap ( unordered_map& ump );

交换两个unordered_map(注意,不是交换特定元素,是整个交换两个map中的所有元素)

3.3.7 示例代码

运行结果:

3.4 迭代器和bucket操作

3.4.1 begin

 iterator begin() noexcept;
local_iterator begin ( size_type n );
  • begin() : 返回开始的迭代器(和你的输入顺序没关系,因为它的无序的)
  • begin(int n) : 返回n号bucket的第一个迭代器

3.4.2 end

  iterator end() noexcept;
local_iterator end( size_type n );
  • end(): 返回结束位置的迭代器
  • end(int n) : 返回n号bucket的最后一个迭代器

3.4.3 bucket

 size_type bucket ( const key_type& k ) const;

返回通过哈希计算key所在的bucket(注意:这里仅仅做哈希计算确定bucket,并不保证key一定存在bucket中!)

3.4.4 bucket_count

 size_type bucket_count() const noexcept;

返回bucket的总数

3.4.5 bucket_size

 size_type bucket_size ( size_type n ) const;

返回第i个bucket的大小(这个位置的桶子里有几个元素,注意:函数不会判断n是否在count范围内)

3.4.6 示例代码

运行结果:

转自:https://blog.csdn.net/hk2291976/article/details/51037095

【C++】undered_map的用法总结(1)的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. Vue公司项目实战步骤

    一.无权限,无验证的Vue项目 1.打好HTML+CSS+JS基础,及<Vue 2.0 实战> 2.编写用mock设计的案例: 3.将以上案例的后台用C#改写: 二.带安全验证的Vue项目 ...

  2. RocketMQ源码分析:(二)消息发送的三种方式

    1. 同步传输(可靠,适用于重要的通知消息.短信通知.短信营销系统等) package com.miaoying.rocketmq.client; import lombok.extern.slf4j ...

  3. yidun验证码

    from PIL import Imagefrom selenium import webdriverfrom selenium.webdriver import ActionChainsfrom s ...

  4. mysql 关联

    自关联 设计省信息的表结构provinces id ptitle 设计市信息的表结构cityscitys表的proid表示城市所属的省,对应着provinces表的id值 id ctitle proi ...

  5. spring boot 监听器实例

    在日常项目中订单创建成功后,会有类似各式各样的通知.有站内通知.短信通知.微信,app通知. 伪代码: 这里,只用伪代码示例.各式各样的通知 肯定不只一行代码.只是简化.如果后续还要增加各种各样的通知 ...

  6. pyspider 笔记

    fetch_type='js' 运行 js代码

  7. 【学习】Python进行数据提取的方法总结【转载】

    链接:http://www.jb51.net/article/90946.htm 数据提取是分析师日常工作中经常遇到的需求.如某个用户的贷款金额,某个月或季度的利息总收入,某个特定时间段的贷款金额和笔 ...

  8. 浅谈Android之Activity生命周期

     Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Ac ...

  9. drf框架之分页器的用法

    1. 分页器分为:简单分页器与偏移分页器和加密分页器 2.实现一个简单的分页器的用法: # 简单分页 # 第一步,导入分页类 # from rest_framework.pagination impo ...

  10. Java自学如何找工作

    今天聊一下可能大多数人都关注的问题“自学Java如何找工作”那么首先你就要明确现在招聘Java开发的基本要求是什么?下面我们来看一下招聘网站上面的要求,在这里我只随便找了一个比较全面的要求,自己可以去 ...