【C++】: unordered_map的使用

news2024/9/24 22:39:52

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 insertion
    myrecipe.insert(make_pair<string, double>("eggs", 6.0)); // move insertion
    myrecipe.insert(mypantry.begin(), mypantry.end());  // range insertion
    myrecipe.insert({ {"sugar",0.8},{"salt",0.1} });    // initializer list insertion

    return 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 iterator
    mymap.erase("France");             // erasing by key
    mymap.erase(mymap.find("China"), mymap.end()); // erasing by range


    return 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.coloradmin.cn/o/1271978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IIS post .html页面报 405错误

IIS是不允许本地文件默认post请求的&#xff0c;windows10系统下的IIS&#xff08;10.0版&#xff09;默认也是不能 post请求\*.html或\*.json文件的 1 需要配置一下&#xff0c;配置如下&#xff1a; 2 双击处理程序映射&#xff0c;添加托管处理程序&#xff1a; 3 请求路径 …

低价商品采购API接口

采购商品地址http://sly.yizhaosulianyun.com/More/Push/888889?type3 低价商品采购API接口 1) 请求地址 http://sly.yizhaosulianyun.com/jd/keyWords 2) 调用方式&#xff1a;HTTP post 3) 接口描述&#xff1a; 低价商品采购接口 4) 请求参数: POST参数: 字段名称字段…

MySQL组合索引,最左匹配原则失效

说明&#xff1a;在SQL优化时&#xff0c;建立组合索引&#xff0c;我们需要知道最左匹配失效的情况&#xff0c;本文通过实例介绍最左匹配原则失效&#xff1b; 建立组合索引 如下&#xff0c;是一张大表&#xff0c;有1000万条数据&#xff1b; 对表中password、sex和email…

JMeter从入门到精通

1、 jmeter的介绍 jmeter也是一款接口测试工具&#xff0c;由java语言开发的&#xff0c;主要进行性能测试。 2、jmeter安装 jmeter官网下载链接&#xff1a; https://jmeter.apache.org/download_jmeter.cgi &#xff0c;查看是否安装成功【jmeter -v】 下载 java jdk1.8&…

StartRocks 连接 Paimon外部表

版本 StartRocksPaimon3.2.00.5 sr 环境准备 CREATE external CATALOG paimon_hdfs PROPERTIES ("type" "paimon",paimon.catalog.type filesystem,"paimon.catalog.warehouse" "hdfs://hadoop03:9000/paimon/test" );mysql> …

虚幻学习笔记4—文本内容处理

一、前言 本文使用的虚幻引擎5.3.2&#xff0c;在虚幻中已经集成了很多可以直接处理多样化文本的蓝图&#xff0c;比如格式化动态显示、浮点数多样化等。 二、实现 2.1、格式化文本显示动态内容&#xff1a;在设置某个文本时可以使用“Format Text”蓝图设置自定义可以的显示…

使用C#和HtmlAgilityPack打造强大的Snapchat视频爬虫

概述 Snapchat作为一款备受欢迎的社交媒体应用&#xff0c;允许用户分享照片和视频。然而&#xff0c;由于其特有的内容自动消失特性&#xff0c;爬虫开发面临一些挑战。本文将详细介绍如何巧妙运用C#和HtmlAgilityPack库&#xff0c;构建一个高效的Snapchat视频爬虫。该爬虫能…

JOSEF约瑟 大功率抗干扰继电器\NR0521\220VDC 导轨安装

NR系列大功率继电器 系列型号&#xff1a; NR0521B大功率继电器 NR0521A大功率继电器 NR0521型大功率继电器 用途 大功率继电器NR0521220VDC 导轨安装在电力工程实际应用中&#xff0c;为防止母线电压经过PT二次侧反馈至高压侧&#xff0c;需要在PT二次侧串接PT刀闸重动接…

SAP SD 创建交货单 报错 VL461 VL248

因为生产环境已经被改好了&#xff0c;无法跟踪 所以换到测试环境重现一把&#xff0c;如何追根究底 对比正常订单发现 计划行 VBEP-LMENG,VBEP-BMENG这两个字段上的值跟 订单数量不一致。 尝试修改2者的数据跟订单数据一致&#xff0c;则可以正常创建交货单 实际原因是&a…

app广告变现如何提高变现收益?提高广告点击率

在广告变现实践过程中&#xff0c;我们往往会遇到一些问题&#xff0c;比如广告的填充不够、eCPM太低&#xff0c;该展示的广告没有展示出来&#xff0c;又或者广告位选择不合理导致用户负面反馈变多&#xff0c;这些种种问题都会影响我们的广告变现效率。 广告三大要素&#…

16.9%份额,启明星辰集团连续21年IDS/IPS排名第一

近日&#xff0c;赛迪顾问发布《2022-2023年中国网络信息安全市场研究年度报告》。报告显示&#xff1a;2022年&#xff0c;启明星辰集团IDS/IPS以16.9%的份额占据市场第一。至今&#xff0c;启明星辰集团IDS/IPS已连续21年保持市场占有率第一。 多年来&#xff0c;启明星辰集团…

postman打开白屏

现状&#xff1a;postman打开白屏如下图 window环境变量&#xff1a; Win R 快捷键打开 sysdm.cpl 增加环境变量&#xff1a; 变量名&#xff1a;POSTMAN_DISABLE_GPU 值&#xff1a;true 重新打开postman

Aurora8B10B(一) 从IP配置界面学习Aurora

一. 简介 哈喽&#xff0c;大家好&#xff0c;好久没有给大家写FPGA技术的文章&#xff0c;是不是已经忘记我是做FPGA的啦&#xff0c;O(∩_∩)O哈哈~。 这里将会给大家分享我学习到的第一个高速接口Aurora8B10B&#xff0c;有点复杂&#xff0c;但不是特别复杂&#xff0c;对…

WPF实战项目十八(客户端):添加新增、查询、编辑功能

1、ToDoView.xmal添加引用&#xff0c;添加微软的行为类 xmlns:i"http://schemas.microsoft.com/xaml/behaviors" 2、给项目添加行为 <i:Interaction.Triggers><i:EventTrigger EventName"MouseLeftButtonUp"><i:InvokeCommandAction Com…

软件开发:基础源代码分享与入门指南

一、引言 软件开发是当今信息时代的一个热门领域&#xff0c;广泛应用于各个行业和领域&#xff0c;本文将向大家介绍软件开发的基础知识&#xff0c;并通过分享一些基础源代码&#xff0c;帮助大家更好地入门软件开发。 二、软件开发概述 软件开发是指通过编程语言和开发工…

容器有挂载目录的时候,容器反向生成为镜像,挂载的内容不会保留。只有实打实拷贝进容器的反向生成镜像才会保留。

无容器目录挂载 1、也就是说宿主机未与容器进行路径映射&#xff0c;故我们可以直接使用指令: docker commit 容器名称/容器ID 像名:标签号&#xff0c;把容器保存为镜像; (其中镜像名和标签号是我们随机取的&#xff0c;新镜像名以及我们的标签号!) 2、我们在不能判断容器与宿…

spring RedisTemplate RedisLockRegistry opsForXxx 基本使用总结以及介绍

一、基本介绍 RedisTemplate 为 spring 对 redis 操作的高度封装&#xff0c;基本已经满足所有使用场景。 若存在其他拓展使用我们可以自行封装工具类对基本操作进行组装。 RedisLockRegistry 对 redis 锁的一些封装 二、不同环境下依赖以及基本配置 2.1 spring-boot 下依赖…

【python】当当书籍数据抓取分析与可视化(代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Java多线程-第20章

Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中&#xff0c;线程是一种轻量级的子进程&#xff0c;它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现&#xff1a;继承Threa…

【李肯C语言小册.目录】小册价值、内容目录汇总、加群方法 | 必看收藏.

小册订阅戳这里&#xff1a;【C语言小册 必读】为什么有这份专栏&#xff1f;解决什么问题&#xff1f;有哪些价值&#xff1f;是否值得订阅&#xff1f;-CSDN社区 订阅后&#xff0c;记得加微VX找我&#xff0c;发zhi付截图&#xff0c;备注【C语言小册】&#xff0c;拉你进本…