文章目录

  • 1. std::unordered_map 的定义与特性
  • 2. 构造 std::unordered_map
  • 3. 赋值操作
  • 4. 迭代器操作
    • 4.1 指向整个容器中的元素
    • 4.2 指向某个桶中的元素
  • 5. 容量操作
  • 6. 访问操作
  • 7. 插入操作
  • 8. 删除操作
  • 9. 查找操作
  • 10. 桶操作

1. std::unordered_map 的定义与特性

  • 所在头文件:<unordered_map>

  • std::unorederd_map类模板:

template < class Key,                                    // unordered_map::key_typeclass T,                                      // unordered_map::mapped_typeclass Hash = hash<Key>,                       // unordered_map::hasherclass Pred = equal_to<Key>,                   // unordered_map::key_equalclass Alloc = allocator< pair<const Key,T> >  // unordered_map::allocator_type> class unordered_map;
  • 关联性:std::unorederd_map 是一个关联容器,其中的元素根据键来引用,而不是根据索引来引用。

  • 无序性:在内部,std::unordered_map中的元素不会根据其键值或映射值按任何特定顺序排序,而是根据其哈希值组织到桶中,以允许通过键值直接快速访问各个元素(常量的平均时间复杂度)。

  • 唯一性:std::unorederd_map中的元素的键是唯一的。

一些类型定义:

类型成员 定义
key_type 第一个模板参数(Key)
mapped_type 第二个模板参数(T)
value_type pair<const key_type,mapped_type>
hasher 第三个模板参数(Hash)
key_equal 第四个模板参数(Pred)

2. 构造 std::unordered_map

构造方式 函数声明
构造空的 unordered_map explicit unordered_map ( size_type n = /* see below */,
                                        const hasher& hf = hasher(),
                                        const key_equal& eql = key_equal(),
                                        const allocator_type& alloc = allocator_type() );

explicit unordered_map ( const allocator_type& alloc );

由一对范围迭代器指定输入 template <class InputIterator>
unordered_map(InputIterator first, InputIterator last,
                           size_type n = /* see below */,
                           const hasher& hf = hasher(),
                           const key_equal& eql = key_equal(),
                           const allocator_type& alloc = allocator_type() );
复制构造 unordered_map ( const unordered_map& ump );
unordered_map ( const unordered_map& ump, const allocator_type& alloc );
移动构造 unordered_map ( unordered_map&& ump );
unordered_map ( unordered_map&& ump, const allocator_type& alloc );
利用初始化列表构造 unordered_map (initializer_list<value_type> il,
                            size_type n = /* see below */,
                            const hasher& hf = hasher(),
                            const key_equal& eql = key_equal(),
                            const allocator_type& alloc = allocator_type() );

参数解释:
n : 初始时,桶的最小数量,即最少有多少个桶。
hf : 哈希函数对象。它是一个函数,根据传递给它的键计算并返回一个整数。
eql : 比较函数对象。如果传递给它的两个参数相等,则返回true.

例子:

// constructing unordered_maps
#include <iostream>
#include <string>
#include <unordered_map>typedef std::unordered_map<std::string,std::string> stringmap;stringmap merge (stringmap a,stringmap b) {stringmap temp(a); temp.insert(b.begin(),b.end()); return temp;
}int main () {stringmap first;                              // empty// 一个元素为:{key, value}stringmap second ( {{"apple","red"}, {"lemon","yellow"}} );       // init liststringmap third ( {{"orange","orange"}, {"strawberry","red"}} );  // init liststringmap fourth (second);                    // copystringmap fifth (merge(third,fourth));        // movestringmap sixth (fifth.begin(),fifth.end());  // rangestd::cout << "sixth contains:"<<endl;for (auto& x: sixth) std::cout << x.first << ":" << x.second<<endl;std::cout << std::endl;system("pause");return 0;
}

运行结果:

3. 赋值操作

赋值方式 函数声明
复制 unordered_map& operator= ( const unordered_map& ump );
移动 unordered_map& operator= ( unordered_map&& ump );
初始化列表 unordered_map& operator= ( intitializer_list<value_type> il );

例子:

// assignment operator with unordered_map
#include <iostream>
#include <string>
#include <unordered_map>typedef std::unordered_map<std::string, std::string> stringmap;stringmap merge(stringmap a, stringmap b) {stringmap temp(a);temp.insert(b.begin(), b.end());return temp;
}int main() {//stringmap first, second, third;//此处连续定义三个会报错。stringmap  first = { { "AAPL", "Apple" }, { "MSFT", "Microsoft" } };  // init liststringmap second = { { "GOOG", "Google" }, { "ORCL", "Oracle" } };   // init liststringmap third = merge(first, second);                       // movefirst = third;                                     // copystd::cout << "first contains:"<<std::endl;for (auto& elem : first)std::cout << elem.first << ":" << elem.second<<std::endl;std::cout << std::endl;system("pause");return 0;
}

运行结果:

4. 迭代器操作

4.1 指向整个容器中的元素

即,“第一个”指整个容器中的第一个,“尾后”指整个容器中的尾后。

函数声明 解释
iterator begin() noexcept;
const_iterator begin() const noexcept;
返回一个迭代器,指向第一个元素
iterator end() noexcept;
const_iterator end() const noexcept;
返回一个迭代器,指向尾后元素
const_iterator cbegin() const noexcept; 返回一个常量迭代器,指向第一个元素
const_iterator cend() const noexcept; 返回一个常量迭代器,指向尾后元素

4.2 指向某个桶中的元素

即,“第一个”指某个桶中的第一个,“尾后”指某个桶中的尾后。

函数声明 解释
local_iterator begin( size_type n );
const_local_iterator begin ( size_type n ) const;
返回一个迭代器,指向第n个桶内的第一个元素
local_iterator end(size_type n);
const_local_iterator end (size_type n) const;
返回一个迭代器,指向第n个桶内的尾后元素
const_local_iterator cbegin( size_type n ) const; 返回一个常量迭代器,指向第n个桶内的第一个元素
const_local_iterator cend( size_type n ) const; 返回一个常量迭代器,指向第n个桶内的尾后元素

例子:

// unordered_map::cbegin/cend example
#include <iostream>
#include <string>
#include <unordered_map>int main() {std::unordered_map<std::string, std::string> mymap= { { "Australia", "Canberra" }, { "U.S.", "Washington" }, { "France", "Paris" } };std::cout << "mymap contains:"<<std::endl;for (auto it = mymap.cbegin(); it != mymap.cend(); ++it)std::cout << it->first << ":" << it->second<<std::endl;  // cannot modify *itstd::cout << std::endl;std::cout << "mymap's buckets contain:\n";for (unsigned i = 0; i < mymap.bucket_count(); ++i) {std::cout << "bucket #" << i << " contains:";for (auto local_it = mymap.cbegin(i); local_it != mymap.cend(i); ++local_it)std::cout << local_it->first << ":" << local_it->second;std::cout << std::endl;}system("pause");return 0;
}

运行结果:

5. 容量操作

函数声明 解释
bool empty() const noexcept; unordered_map 是否为空
size_type size() const noexcept; 获取unordered_map 中元素的数量

6. 访问操作

访问方式 函数声明 解释
使用方括号([]) mapped_type& operator[] (const key_type& k);

mapped_type& operator[] (key_type&& k);

如果 k 匹配容器中某个元素的键,则该函数返回该映射值的引用。

如果 k 与容器中任何元素的键都不匹配,则该函数将使用该键插入一个新元素,并返回该映射值的引用。

使用 at() mapped_type& at (const key_type& k);

const mapped_type& at (const key_type& k) const;

如果 k 匹配容器中某个元素的键,则该函数返回该映射值的引用。

如果 k 与容器中任何元素的键都不匹配,则该函数将抛出 out_of_range 异常。

注意:const std::unordered_map 不能使用 operator[] 操作!!

例子:

// unordered_map::at
#include <iostream>
#include <string>
#include <unordered_map>int main() {std::unordered_map<std::string, int> mymap = {{ "Mars", 3000 },{ "Saturn", 60000 },{ "Jupiter", 70000 } };mymap.at("Mars") = 3396;mymap.at("Saturn") += 272;mymap.at("Jupiter") = mymap.at("Saturn") + 9638;for (auto& x : mymap) {std::cout << x.first << ": " << x.second << std::endl;}system("pause");return 0;
}

运行结果:

7. 插入操作

插入方式 函数声明 说明
插入单个元素 pair<iterator,bool> insert (const value_type& val);

template <class P>
pair<iterator,bool> insert (P&& val); // 类型P应当可以转换为 value_type类型

返回一个pair,其中第一个值为一个迭代器,指向新插入的元素或其键等于待插入元素的键的元素(原先就已存在的元素);第二个值是一个bool值,当插入一个新元素时,该值设为true,当该键已存在时,该值设为false
带插入位置提示 iterator insert (const_iterator position, const value_type& val);

template <class P>
iterator insert (const_iterator position, P&& val);

返回一个迭代器,该迭代器指向新插入的元素或指向键相等的已存在元素。
由一对范围迭代器指定输入 template <class InputIterator>
void insert (InputIterator first, InputIterator last);
使用初始化列表指定插入元素 void insert (initializer_list<value_type> il);

例子:

// unordered_map::insert
#include <iostream>
#include <string>
#include <unordered_map>int main() {std::unordered_map<std::string, double>myrecipe,mypantry = { { "milk", 2.0 }, { "flour", 1.5 } };std::pair<std::string, double> myshopping("baking powder", 0.3);myrecipe.insert(myshopping);                        // copy insertionmyrecipe.insert(std::make_pair<std::string, double>("eggs", 6.0)); // move insertionmyrecipe.insert(mypantry.begin(), mypantry.end());  // range insertionmyrecipe.insert({ { "sugar", 0.8 }, { "salt", 0.1 } });    // initializer list insertionstd::cout << "myrecipe contains:" << std::endl;for (auto& x : myrecipe)std::cout << x.first << ": " << x.second << std::endl;std::cout << std::endl;system("pause");return 0;
}

运行结果:

8. 删除操作

删除方式 函数声明 说明
根据元素位置 iterator erase (const_iterator position); 返回一个迭代器,指向被删除元素的后一个元素
根据元素的键 size_type erase (const key_type& k); 返回被删除元素的数目,此处为1
由一对范围迭代器指定删除的范围 iterator erase (const_iterator first, const_iterator last); 返回一个迭代器,指向最后一个被删除元素的后一个元素
删除所有元素 void clear() noexcept;

例子:

// unordered_map::erase
#include <iostream>
#include <string>
#include <unordered_map>int main() {std::unordered_map<std::string, std::string> mymap;// populating container:mymap["U.S."] = "Washington";mymap["U.K."] = "London";mymap["France"] = "Paris";mymap["Russia"] = "Moscow";mymap["China"] = "Beijing";mymap["Germany"] = "Berlin";mymap["Japan"] = "Tokyo";// erase examples:mymap.erase(mymap.begin());      // erasing by iteratormymap.erase("France");             // erasing by keymymap.erase(mymap.find("China"), mymap.end()); // erasing by range// show content:for (auto& x : mymap)std::cout << x.first << ": " << x.second << std::endl;system("pause");return 0;
}

运行结果:

9. 查找操作

函数声明 说明
iterator find (const key_type& k);

const_iterator find (const key_type& k) const;

在容器中搜索键值等于 k 的元素,如果找到,则返回一个指向该元素的迭代器,否则返回一个指向unordered_map :: end的迭代器。

例子:

// unordered_map::find
#include <iostream>
#include <string>
#include <unordered_map>int main () {std::unordered_map<std::string,double> mymap = {{"mom",5.4},{"dad",6.1},{"bro",5.9} };std::string input;std::cout << "who? ";getline (std::cin,input);// 查找std::unordered_map<std::string,double>::const_iterator got = mymap.find (input);if ( got == mymap.end() )std::cout << "not found";elsestd::cout << got->first << " is " << got->second;std::cout << std::endl;system("pause");return 0;
}

运行结果:

10. 桶操作

函数声明 说明
size_type bucket_count() const noexcept; 获取容器中桶的数目
size_type bucket_size ( size_type n ) const; 获取第 n 个桶中元素的数量
size_type bucket ( const key_type& k ) const; 获取键为 k 的元素所在桶的序号

参考:http://www.cplusplus.com/reference/unordered_map/unordered_map/


以上博文来自:

  • W.T.F._C++ std::unordered_map 用法详解

C++/C--unordered_map常见用法详解相关推荐

  1. C++中的unordered_map常见用法详解

    文章目录 1. std::unordered_map 的定义与特性 2. 构造 std::unordered_map 3. 赋值操作 4. 迭代器操作 4.1 指向整个容器中的元素 4.2 指向某个桶 ...

  2. 《算法笔记》学习日记——6.1 vector的常见用法详解

    目录 6.1 vector的常见用法详解 问题 A: Course List for Student (25) 问题 B: Student List for Course (25) 小结 6.1 ve ...

  3. Linux中head和tail命令作用,Linux 命令head和tail常见用法详解

    head和tail是一组想对应的命令,默认分别显示文件的开头和末尾10行记录. head head 命令可以将一段文本的开头一部分输出到标准输出. head命令既可以处理文本文件也可以处理标准输入. ...

  4. linux lvm2,LVM2常见用法详解

    LVM2常见用法详解 1.简介 LVM(Logical Volume Manager)是逻辑卷管理的意思,是linux环境下对磁盘分区进行管理的一种机制,lvm是建立在硬盘和分区之上的一个逻辑层,来提 ...

  5. C++/C--set常见用法详解【转载】

    1 概念 set是一个内部自动有序且不含重复元素的容器,其实现自动去重按升序排序.使用set,需要添加头文件:#include <set>.可以通过迭代器*it来访问set里面的元素,但是 ...

  6. python propresql mysql_python数据库操作mysql:pymysql、sqlalchemy常见用法详解

    本文实例讲述了python数据库操作mysql:pymysql.sqlalchemy常见用法.分享给大家供大家参考,具体如下: 相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 ...

  7. dig命令的常见用法详解

    CATALOG 什么是dig 一个查询的例子 常见用法 什么是dig dig(域信息搜索器)命令是一个用于询问 DNS 域名服务器的灵活的工具.它执行 DNS 搜索,显示从受请求的域名服务器返回的答复 ...

  8. pair的常见用法详解

    目录 前言 pair的定义 pair中元素的访问 pair常用函数实例解析 pair的常见用途 前言 pair是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素,又 ...

  9. priority_queue的常见用法详解

    目录 前言 priorithy_queue的定义 priority_queue容器内元素的访问 priority_queue常用函数 priority_queue内元素优先级的设置 priority_ ...

最新文章

  1. 特斯拉AI主管给你的33条深度学习训练建议
  2. system.DateTime ToDateTime(System.String)”,因此该方法无法转换为存储表达式-解决方法...
  3. CSS十问——好奇心+刨根问底=CSSer (转)
  4. 第三章:3.7 傅里叶变换性质(一)
  5. (89)多周期时序约束(四)
  6. linux 项目内存吃掉,Linux内存被吃掉了,它去哪里了?
  7. centreon与nagios整合
  8. Zint生成二维码环境搭建
  9. SPSS中的数据分析—信度效度检验【1】
  10. Saas平台级架构:统一身份认证管理系统用户权限管理
  11. 高防CDN是什么?有什么作用?
  12. 我的IOS端SIP电话开发历程
  13. 数组中重复的元素(剑指Offe.03)
  14. PGSQL 模糊查询不区分大小写
  15. PowerQuery操作分类
  16. OnInitDialog()中SetFocus()不起作用解决方法
  17. mshtml与System.Windows.Forms.HtmlElement
  18. 使用MySQL管理工具-SQLyog 9.63报错号码2058,超详细解析
  19. R语言绘制gif动图
  20. 浏览器打不开服务器网页,浏览器打不开某几个网页,这样来解决

热门文章

  1. 如何使用Restic Backup Client将数据备份到对象存储服务
  2. ElasticSearch面试 - es 写入数据的工作原理是什么啊?
  3. Fedora中systemctl命令的使用
  4. C语言,计算数据类型及所对应的字节数。
  5. C语言 结构体的初次运用
  6. 数组(Array)的常用方法
  7. 【Python爬虫】Re(正则表达式)库入门
  8. C#LeetCode刷题之#169-求众数(Majority Element)
  9. windows上的一些命令和工具
  10. oc开源应用_失眠:一款开源应用,可根据睡眠周期告诉您何时入睡