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. 基于ssd的手势识别模型(object detection api方式)

    [Tensorflow]Object Detection API-训练自己的手势识别模型 1. 安装tensorflow以及下载object detection api 1.安装tensorflow: ...

  2. python 字符串转16进制函数

    需要用python处理16进制的文本,比如像下面这个文本 40 80 C0 40 80 C0 40 80 C0 40 80 C0 40 BF CC 40 80 C0 40 80 C0 40 80 C0 ...

  3. js对象原型prototype

    javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属性叫做原型 1.1. 原型法设 ...

  4. c3.cpp

    Char16_t(在字符串前加u)和char32_t(在字符串前加U)都是无符号的,数字代表长度(底层长度随系统而定) 在函数bool中,任何非0值都代表真(即使他是个负数),只有0代表false 一 ...

  5. hashcode()和equals()

    一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实 ...

  6. k8s 命令补全

    安装:apt-get install bash-completion source <(kubectl completion bash) echo "source <(kubec ...

  7. Hexo:创建属于你自己的博客

    step: 1.install node.js,git,github 2.npm install -g hexo-cli 3.mkdir hexo 4.cd hexo mkdir blog 5.cd ...

  8. 调试dump文件

    1.设置好pdb文件和源代码路径 为了能正确分析Dump文件,我们必须要指定和程序一起出来的PDB文件,如果程序重新被编译了一次,即使代码没有任何变化,之前的PDB文件我们不能再继续使用.

  9. 【HDFS API编程】图解客户端从HDFS读数据的流程

  10. 再论 ORM

    Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射. ORM 对象关系映射,这样说还是懵. 这里比较难理解的是 关系 —— 即Relationl ,虽然看起 ...