【C++】unordered 系列关联式容器

文章目录

  • 1. unordered 系列关联式容器
  • 2. unordered_map
    • 2.1 unordered_map 的文档介绍
    • 2.2 unordered_map 的接口说明
  • 3. unordered_set
  • 4. 在线 OJ

在这里插入图片描述

1. unordered 系列关联式容器

在 C++ 98 中,STL 提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 l o g 2 N log_2 N log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是:进行很少的比较次数就能将元素找到,因此在 C++ 11 中,STL 又提供了 4 个 unordered 系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对 unordered_map 和 unordered_set 进行介绍。

2. unordered_map

2.1 unordered_map 的文档介绍

unordered_map

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

2.2 unordered_map 的接口说明

  1. unordered_map 的构造

    函数声明功能介绍
    unordered_map构造不同格式的 unordered_map 对象
  2. unordered_map 的容量

    函数声明功能介绍
    bool empty() const检测 unordered_map 是否为空
    size_t size() const获取 unordered_map 的有效元素个数
  3. unordered_map 的迭代器

    函数声明功能介绍
    begin返回 unordered_map 第一个元素的迭代器
    end返回 unordered_map 最后一个元素下一个位置的迭代器
    cbegin返回 unordered_map 第一个元素的 const 迭代器
    cend返回 unordered_map 最后一个元素下一个位置的 const 迭代器
  4. unordered_map 的元素访问

    函数声明功能介绍
    operator[]返回 key 对应的 value,没有返回一个默认值

    注意:该函数中实际调用哈希桶的插入操作,用参数 key 与 V() 构造一个默认值往底层哈希桶中插入,如果 key 不再哈希桶中,插入成功,返回 V();插入失败,说明 key 已经在哈希桶中,将 key 对应的 value 返回。

  5. unorder_map 的查询

    函数声明功能介绍
    iterator find(const K& key)返回 key 在哈希桶中的位置
    size_t count(const K& key)返回哈希桶中关键码为 key 的键值对的个数

    注意:unordered_map 中 key 是不能重复的,因为 count 函数的返回值最大为 1。

  6. unordered_map 的修改操作

    函数声明功能介绍
    insert向容器中插入键值对
    erase删除容器中的键值对
    void clear()清空容器中有效元素个数
    void swap(unordered_map&)交换两个容器中的元素
  7. unordered_map 的桶操作

    函数声明功能介绍
    size_t bucket_count() const返回哈希桶中桶的总个数
    size_t bucket_size(size_t n) const返回 n 号桶中有效元素的总个数
    size_t bucket(const K& key)返回元素 key 所在的桶号

3. unordered_set

参见 unordered_set 在线文档说明。

4. 在线 OJ

  1. 在长度 2N 的数组中找出重复 N 次的元素

    class Solution
    {
    public:int repeatedNTimes(vector<int>& nums){int n = nums.size() / 2;// 用 unordered_map 统计每个元素出现的次数unordered_map<int, int> hash;for (auto& e : nums){++hash[e];}// 找出出现次数为 n 的元素个数for (auto& e : hash){if (e.second == n){return e.first;}}return 0;}
    };
    
  2. 两个数组的交集

    class Solution
    {
    public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2){// 使用 unordered_set 去重unordered_set<int> us1;for (auto& e : nums1){us1.insert(e);}unordered_set<int> us2;for (auto& e : nums2){us2.insert(e);}// 遍历 us1,在 us2 中寻找 us1 的每个元素,如果找到,即为交集vector<int> ret;for (auto& e : us1){if (us2.find(e) != us2.end()){ret.push_back(e);}}return ret;}
    };
    
  3. 两个数组的交集 Ⅱ

    class Solution
    {
    public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2){// 使用 unordered_map 统计次数unordered_map<int, int> um1;for (auto& e : nums1){++um1[e];}unordered_map<int, int> um2;for (auto& e : nums2){++um2[e];}// 遍历 um1,在 um2 中查找 um1 的各个元素,并找到该元素出现次数的较小值vector<int> ret;for (auto& e : um1){auto it = um2.find(e.first);if (it != um2.end()){// 找较小值int less = e.second;if (e.second > (*it).second){less = (*it).second;}// 插入for (int i = 0; i < less; i++){ret.push_back(e.first);}}}return ret;}
    };
    
  4. 存在重复元素

    class Solution
    {
    public:bool containsDuplicate(vector<int>& nums){unordered_map<int, int> um;// 我们把 nums 各元素插入到 unordered_map 中for (auto& e : nums){// 如果在插入之前发现该元素已经存在于 unordered_map 中,说明该元素是重复的if (um.find(e) != um.end()){return true;}++um[e];}return false;}
    };
    
  5. 两句话中的不常见单词

    class Solution
    {
    public:vector<string> uncommonFromSentences(string s1, string s2){// 分析题意,发现要找的单词就是在两个句子中只出现一次的单词string str = s1 + " " + s2 + " ";unordered_map<string, int> um;// 分割字符串入哈希表int begin = 0, end = 0;while (begin < str.size()){// size_t find (const string& str, size_t pos = 0) const;end = str.find(" ", begin);// string (const string& str, size_t pos, size_t len = npos);int npos = end - begin;string key(str, begin, npos);++um[key];begin = end + 1;}// 找到出现次数为 1 的单词vector<string> ret;for (auto& e : um){if (e.second == 1){ret.push_back(e.first);}}return ret;}
    };
    

END

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

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

相关文章

LeetCode-热题100:300. 最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示…

mybatis(4) 代理机制以及小技巧

mybatis 1、 问题2、使用3、#与$3.1 例子3.2什么情况下必须使用${} 4、别名机制5 、Mapper配置6、配置模板文件7、使用自动生成的主键 1、 问题 在上一篇mybtis的web项目中&#xff0c;我们最后有一个问题没有解决&#xff0c;就是dao的实现类&#xff0c;其代码很类似&#x…

Python 正则表达式(re)

&#x1f680; 个人主页&#xff1a;xmp65535 &#x1f680; 专栏&#xff1a;python技术专栏 目录 一、概述 二、基本概念 模式字符串 原始字符串 编译正则表达式 三、正则表达式的基本模式匹配 字符匹配 锚点 量词 四、常用函数 re.match() re.search() re.find…

Mybase 8.x 下载安装试用详细教程(Windows)

一、软件介绍 MyBase是一款本地笔记软件&#xff0c;它能够帮助你管理和组织大量的信息。 二、下载安装 下载&#xff1a;点我去下载页面 Mybase 软件目前主要实现了两种版本&#xff1a;Mybase Desktop (桌面版) 和 Mybase Server (网络版)&#xff1a; 桌面版软件运行于 …

零售行业数字化广告评价标准 - 《IAB/MRC零售(广告)测量指南》

IAB/MRC零售&#xff08;广告&#xff09;测量指南 --- 最新标准&#xff0c;2024年1月发布 目录 1出台此标准的目的是什么&#xff1f;2标准宗旨3本标准的主要关键领域4为什么这对品牌和零售商很重要5能给零售媒体中小型玩家带来什么机会&#xff1f;6评价零售媒体效果的最…

金仓数据库Kingbase的数据库开发管理工具KStudio连接乱码

背景&#xff1a; 金仓数据库V8R6&#xff0c;KStudio在Windows10上运行&#xff0c;JDK8 问题&#xff1a; 使用客户端连接数据库时&#xff0c;提示信息乱码&#xff0c;首选项设置字符集不管用&#xff0c;具体如下图所示&#xff1a; Before&#xff1a; After&#xff1…

谷歌(Google)历年编程真题——给字符串添加加粗标签

谷歌历年面试真题——数组和字符串系列真题练习。 给字符串添加加粗标签 给定字符串 s 和字符串数组 words。 对于 s 内部的子字符串&#xff0c;若其存在于 words 数组中&#xff0c; 则通过添加闭合的粗体标签 <b> 和 </b> 进行加粗标记。 如果两个这样的子字…

软件设计师——1.备考提纲

知识点说明比例软件工程基础知识11开发模型、设计原则、测试方法、质量特性、CMM、Pert图、风险管理14.67%面向对象12面向对象基本概念、面向对象分析与设计、UML、设计模式16.00%数据结构与算法10数组、栈、队列、树与二叉树、图、查找与排序、常见算法13.33%程序设计语言6文法…

【CPA考试】2024注册会计师报名照片尺寸要求解读及手机拍照方法

随着2024年注册会计师考试的临近&#xff0c;众多会计专业人士和学生都开始准备报名参加这一行业的重要考试&#xff0c;报名时间为4月8日至4月30日。报名过程中&#xff0c;一张符合要求的证件照是必不可少的。本文将为您详细解读2024年注册会计师考试报名照片的尺寸要求&…

sfml sdl2 windows vscode 调试和coderunner插件运行

链接库写在编译链接命令里&#xff0c;如果没有使用到不会加入到生成的可执行文件里。所以tasks.json可以这样写&#xff0c; {"version": "2.0.0","tasks": [{"type": "cppbuild","label": "C/C: g.exe 生…

GlusterFS分布式文件系统

一、GlusterFS简介 GlusterFS 是一个开源的分布式文件系统。由存储服务器、客户端以及NFS/Samba存储网关(可选&#xff0c;根据需要选择使用)组成。没有元数据服务器组件&#xff0c;这有助于提升整个系统的性能、可靠性和稳定性 二、GlusterFS特点 2.1 扩展性和高性能 Glu…

结合 linux 0.11 源码分析为什么 fork 函数会返回两个值

#&#xff08;1&#xff09;学习资料是这些书 以及赵炯博士的完全剖析。谢谢这些大师与网上优秀的文章。 #&#xff08;2&#xff09;看 linux 0.11 源码是 sourceinlight 4.这里附上一个安装包。 由本图可知&#xff0c; main 函数对 fork 函数的调用。 fork 函数实际是定…

掌握苹果电脑保养秘籍,全方位维护指南!

苹果电脑&#xff08;Mac&#xff09;凭借卓越的性能表现、精致的设计美学以及深入人心的操作系统体验赢得了全球用户的高度评价。不过&#xff0c;无论是哪款顶级配置的Mac产品&#xff0c;都需要经过适时且恰当的保养维护&#xff0c;才能持续展现最优性能。 苹果电脑维护小…

python应用题例子--改试卷

要求&#xff1a;在现实生活中&#xff0c;写一些小函数帮助老师改卷子&#xff0c;比如选择题&#xff0c;本次数学题有12道&#xff0c;正解答案是ABCDCCDDBABA,请根据正确答案&#xff0c;找出学生的错误题并统计正常率。 CORRECT_ANSWERS"ABCDCCDDBABA" #一般习…

最新AI工具系统ChatGPT网站运营源码SparkAi系统V6.0版本,GPTs应用、AI绘画、AI换脸、垫图混图、Suno-v3-AI音乐生成大模型全支持

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

Django之五种中间件定义类型—process_request、process_view、process_response.......

目录 1. 前言 2. 基础中间件 3. 如何自定义中间件 4. 五种自定义中间件类型 4.1 process_request 4.2 process_view 4.3 process_response 4.4 process_exception 4.5 process_template_response 5. 最后 1. 前言 哈喽&#xff0c;大家好&#xff0c;我是小K,今天咋们…

openhomeny鸿蒙arkts笔记

基于api9&#xff0c;创建arkts file&#xff0c;之前是java或者kotlin代码&#xff0c;转鸿蒙代码的一些笔记 1、final用readonly代替 2、Exception用Error代替 3、String用string代替 4、int&#xff0c;long&#xff0c;float&#xff0c;double等用number代替 5、要给…

探索GlassWire:网络安全与流量监控软件

名人说:东边日出西边雨,道是无晴却有晴。——刘禹锡 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、软件介绍1、GlassWire(免费版本)2、核心特点二、下载安装① 下载(免费版本)② 安装三、使用方法①如何使用?②语言切换③流量监控四、总结

Pytest教程:一文了解如何使用 pytest_runtest_makereport 修改 Pytest 测试报告内容

在软件测试过程中&#xff0c;生成清晰、易读的测试报告对于团队交流、问题追踪和项目进度评估至关重要。Pytest 是一个功能强大的 Python 测试框架&#xff0c;它不仅支持丰富的断言和测试用例组织方式&#xff0c;还提供了灵活的插件系统和钩子函数&#xff0c;可以帮助我们定…

window安装maven和hadoop3.1.4

前面的文章已讲解如何安装idea和进行基本设置&#xff0c;本文主要带着大家安装配置好maven和hadoop. 大家不用去官网下载&#xff0c;直接使用我发给大家的压缩文件&#xff0c;注意解压后的文件夹不要放在中文目录下&#xff0c;课堂上我们讲解过原因。 这是我电脑上的路径&a…