【C++】: unordered_map的使用

1、概念

  • key

               键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。

  • T

                映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。

  • Hash

                一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型的唯一值。这可以是一个实现函数调用操作符的类,也可以是一个指向函数的指针(参见构造函数)。默认为hash<Key>。

  • Pred

                接受两个键类型参数并返回bool类型的二进制谓词。表达式pred (a, b), pred是这种类型的一个对象,a和b是键值,返回true,如果是应考虑相当于b。这可以是一个类实现一个函数调用操作符或指向函数的指针(见构造函数为例)。这默认为equal_to<Key>,它返回与应用相等操作符(a==b)相同的结果。

  • Allloc

                用于定义存储分配模型的allocator对象的类型。默认情况下,使用allocator类模板,它定义了最简单的内存分配模型,并且与值无关。

  • unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。
  • 在unordered_map中,键值通常用于唯一的标识元素(键值是唯一的),而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。
  • 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
  • unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭 代方面效率较低。
  • unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value。

2、构造函数

(1)创建空的unordered_map

    unordered_map<int, int> m;

(2)使用初始化列表初始化

    unordered_map<int, int> m1({ { 1,1 } });unordered_map<int, int> m2({{ 1,1 },{ 2,2 },{ 3,3 }});

(3)拷贝构造函数初始化

    unordered_map<int, int> m3(m2);

(4)迭代器初始化 

    unordered_map<int, int> m4(m2.begin(),m2.end());

3、内置函数

3.1、容量

(1)判空(返回bool值)

    unordered_map<int, int> m;cout << m.empty();

(2)求大小

    unordered_map<int, int> m;m.size();

 (3)返回无序映射容器可以容纳的最大元素数。

    unordered_map<int, int> m;cout << m.max_size();

3.2、迭代器

    unordered_map<int, int> v;v.begin();          //获取第一个数的位置v.end();            //获取最后一个数的位置unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

3.3、元素访问

    unordered_map<string, string> mymap;mymap["Bakery"] = "Barbara";  mymap["Seafood"] = "Lisa";    mymap["Produce"] = "John";    string name = mymap["Bakery"];   mymap["Seafood"] = name;mymap["Bakery"] = mymap["Produce"];name = mymap["Deli"];      mymap["Produce"] = mymap["Gifts"];    

  3.4、修改器

(1)emplace(插入)

    unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));

 (2)insert(插入)

使用和emplace类似,但是更加灵活

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, double>myrecipe,mypantry = { {"milk",2.0},{"flour",1.5} };pair<string, double> myshopping("baking powder", 0.3);myrecipe.insert(myshopping);                        // copy insertionmyrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertionmyrecipe.insert(mypantry.begin(), mypantry.end());  // range insertionmyrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // initializer list insertionreturn 0;
}

(3)erase(删除)

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;int main()
{unordered_map<string, 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 rangereturn 0;
}

(4)clear(清空)

(5)swap (交换)

3.5、查找 

(1)find(返回迭代器)

 unordered_map<int, string> m;m.emplace(make_pair(1, "yi"));m.emplace(make_pair(2, "er"));unordered_map<int, string>::iterator it = m.find(2);while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

(2)count(计数)

 一般在unordered_map中用不到,因为unordered_map中key的值是唯一的

一般在unordered_multimap中用的较多

4、unordered_map的遍历(迭代)

4.1、迭代器 

unordered_map<int, string>::iterator it = m.begin();while (it != m.end()){cout << (*it).first << " " << (*it).second << endl;it++;}

4.2、范围for 

    for (auto e : m){cout << e.first << " " << e.second << endl;}

总结

  1. unordered_map中的的元素是键值对
  2. unordered_map中的key是唯一的,并且不能修改
  3. unordered_map遍历是一个无需的数列
  4. unordered_map的底层为哈希结构
  5. 支持[ ]操作符,operator[ ]中实际进行插入查找

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/234824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker容器网络模式

1.none网络 1&#xff09;使用默认网络模式创建一个BusyBox容器&#xff0c;用于对比none网络模式&#xff1b; 测试网络&#xff0c;可以正常连接外网。 2&#xff09;再创建一个none网络模式的BusyBox容器&#xff1b; 测试网络连接&#xff0c;无法连接外网。 总结&#x…

什么是木马

木马 1. 定义2. 木马的特征3. 木马攻击流程4. 常见木马类型5. 如何防御木马 1. 定义 木马一名来源于古希腊特洛伊战争中著名的“木马计”&#xff0c;指可以非法控制计算机&#xff0c;或在他人计算机中从事秘密活动的恶意软件。 木马通过伪装成正常软件被下载到用户主机&…

JS之Object.defineProperty方法

给对象添加属性的方法有许多&#xff0c;这次让我为大家介绍一种给对象添加属性的静态方法吧&#xff01; 语法&#xff1a;Objcet.defineProperty(对象的名称&#xff0c;“添加的键名”&#xff0c;{value&#xff1a;键值}) const obj {name:"张三",age:18}// 我…

堆栈_删除字符串所有相邻重复项

//给出由小写字母组成的字符串 S&#xff0c;重复项删除操作会选择两个相邻且相同的字母&#xff0c;并删除它们。 // // 在 S 上反复执行重复项删除操作&#xff0c;直到无法继续删除。 // // 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 // // // // 示…

PowerDesigner数据库建模软件的安装

解压&#xff1a; 解压好以后&#xff0c;点击PowerDesigner.exe安装 这个安装的版本是15 选择安装路径&#xff0c;可以默认可以自定义&#xff1a; 直接点next&#xff1a; 全选了 点击next&#xff1a; 点击next&#xff1a; 点finish 汉化&#xff1a; 先把pojie和汉化文件…

window10家庭版中文转专业版流程

1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions &#xff0c;查询当前支持的升级的版本 4.专业版密钥&#xff1a;VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T

【C++】程序题( STL标准模板库)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

全网最最全的Jmeter接口测试:jmeter_逻辑控制器_交替控制器Jmeter(22):jmeter_逻辑控制器_交替控制器

交替控制器 该控制器包含的取样器步骤在每次循环中交替执行 交替控制器指每次运行一次时在交替控制器下的采样器只执行一个&#xff1b;如下图&#xff1a; 忽略子控制模块&#xff1a;如果勾选此项,交替控制器将子控制器像单一请求元素一样&#xff0c;一次 只允许一个请求/…

csdn最新最全面的Jmeter接口测试:jmeter_逻辑控制器_循环控制器

循环控制器 循环次数&#xff1a;设置该控制器下的请求的循环执行次数 永远&#xff1a;勾选上的话&#xff0c;会一直循环&#xff0c;即所谓死循环 注意&#xff1a;如果线程组本身已经设置了循环次数的话&#xff0c;那循环控制元件控制的子节点 的循环次数为线程组设置的…

Postman如何使用(四):接口测试

一.接口 1.程序内部接口&#xff1a;方法与方法之间&#xff0c;模块与模块之间的交互&#xff0c;程序内部抛出的接口&#xff0c;比如bbs系统&#xff0c;有登录模块&#xff0c;发帖模块等等&#xff0c;那你要发帖就必须先登录&#xff0c;那么这两个模块就得有交互&#…

操作指南 | 如何使用API3请求链下数据

API3是一种去中心化解决方案&#xff0c;用于向智能合约平台提供传统且可扩展的API服务&#xff0c;使开发者能够访问如喂价和QRNG等链下资源。 API3由DAO管理&#xff0c;致力于在智能合约功能中轻松访问各种有用数据。 构建者在Moonbeam上可以访问不同的API3服务&#xff1…

【Web】攻防世界Web_php_wrong_nginx_config

这题考察了绕过登录、目录浏览、后门利用 进来先是一个登录框&#xff0c;随便怎么输前端都直接弹窗 禁用js后再输入后登录 查看源码&#xff0c;好家伙&#xff0c;不管输什么都进不去 直接扫目录 访问/robots.txt 访问/hint.php 访问/Hack.php 抓包看一下 cookie里isLogin0…