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

news2024/11/22 18:09:28

文章目录

  • 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.coloradmin.cn/o/1589344.html

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

相关文章

C/C++进阶/架构师(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)开发学习路线、系统性学习教程

C学习可以划分为几个主要阶段&#xff0c;每个阶段的学习目标和推荐资源都有所不同。下面是一个详细的分阶段学习指南&#xff1a; 入门阶段 学习目标 理解C的基本语法和结构。学习基本数据类型&#xff0c;条件判断&#xff0c;循环等控制结构。掌握函数的使用方法。初步了…

MongoDB副本集部署(windows)

环境准备 本教程演示mongodb4.4 副本集部署&#xff08;一主两从&#xff0c;伪分布式&#xff09; 节点配置主节点localhost:27017从节点1localhost:27018从节点2localhost:27019 每一个节点&#xff08;实例&#xff09;都创建对应的数据文件&#xff08;data&#xff09;…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

acwing2060. 奶牛选美

题目&#xff1a; 代码&#xff1a; //acwing2060. 奶牛选美 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N55; const int dx[]{-1,0,1,0},dy[]{0,-1,0,1}; bool st[N][N]; int point[N][N]; char map[N][…

微信小程序中调取小程序实现报错:提示 开发版小程序已过期,请在开发者工具中重新扫码的 解决方案

出现的问题&#xff1a; 解决方法&#xff1a; 将envVersion: develop,开发版切换为正式版 envVersion: release,wx.navigateToMiniProgram({appId:res.data.appId,path: res.data.prePayTn,extraData: {foo: bar,miniProgramOrgId:res.data.miniProgramOrgId,orderId: res.d…

游标的定义和类型

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 游标的基本概念 游标从字面上理解为游动的光标&#xff0c;可以使用 Excel 表格来想象游标的作用&#xff0c;游标指向每一行&#xff0c;通过游标访问每行数据。 在 Orac…

前端图片详解(最全面、最新)

前言 当我们在做前端性能优化的时候&#xff0c;总是会离不开图片&#xff0c;尤其在首次内容绘制&#xff08;FCP&#xff09;和最大内容绘制 (LCP)中&#xff0c;图片显得格外关键&#xff0c;而我发现关于图片格式的文章&#xff0c;一般不全&#xff0c;或者是偏旧。 所以…

STC89C52学习笔记(十)

STC89C52学习笔记&#xff08;十&#xff09; 综述&#xff1a;本文介绍了DS18B20和单总线协议&#xff0c;以及讲述了如何使用DS18B20测量温度。 一、单总线协议 1.只有一根通讯线&#xff1a;DQ &#xff08;常见的运用单总线的两种设备&#xff1a;DS18B20和DHT11&#…

sectigo ov企业通配符证书

OV通配符SSL证书是Sectigo旗下比较受欢迎的一款数字证书。Sectigo成立时间较长&#xff0c;旗下的数字证书产品可以使用RSA或者ECC等加密算法保护网站传输信息安全&#xff0c;Sectigo旗下的数字证书可以兼容大多数主流浏览器。今天就随SSL盾小编了解Sectigo旗下的OV企业通配符…

10BASE-T1S架构助力车载E/E领域,引领汽车产业迈向智能化新纪元!

汽车架构的发展 如今&#xff0c;汽车已不仅仅满足消费者的代步需求&#xff0c;而是向所谓的ACES&#xff08;Autonomous, Connected, Electrification, Shared Source&#xff09;方向发展&#xff0c;全自动驾驶和网联化将成为最终目标。由此带来的高算力和高数据吞吐量问题…

AR智能眼镜方案_MTK平台安卓主板芯片|光学解决方案

AR眼镜作为一种引人注目的创新产品&#xff0c;其芯片、显示屏和光学方案是决定整机成本和性能的关键因素。在这篇文章中&#xff0c;我们将探讨AR眼镜的关键技术&#xff0c;并介绍一种高性能的AR眼镜方案&#xff0c;旨在为用户带来卓越的体验。 AR眼镜的芯片选型至关重要。一…

tkinter窗口

简单的窗口程序 导入所需的库 from tkinter import * import json 创建一个主窗口 app Tk() 设置窗口大小为 1048x2048 app.geometry(“1048x2048”) 设置窗口背景为灰色 app.configure(bg“gray”) 创建一个 Label 对象&#xff0c;显示 “账号&#xff1a;” 和红色…

算法中的二阶差分

众所周知&#xff0c;在往区间的每一个数都加上一个相同的数k&#xff0c;进行n次后会得到一个新的数列&#xff0c;如果每次加都循环区间挨个数加上k&#xff0c;这样时间复杂度无疑是O(n^2)&#xff0c;很高。这时可以采用一阶差分就可解决&#xff0c;这里默认会一阶差分&am…

【电控笔记7】速度回路+系统延迟

2.3.1速度回路pi控制器设计 Tl:负载转矩

题目:斤斤计较得小Z(蓝桥OJ 2047)

问题描述&#xff1a; 题解&#xff1a; 做法一&#xff08;kmp模板&#xff09;&#xff1a; #include <bits/stdc.h> using namespace std;const int N 1e6 9; char s[N], p[N]; int nex[N];int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);// p: 子…

【每日刷题】Day11

【每日刷题】Day11 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 2. 976. 三角形的最大周长 - 力扣&#xff08;LeetCode&#xff09; 3.…

--每周分享--

分享内容&#xff1a; 1.单链表的归并排序 2.一道有趣的思考题 分享细节&#xff1a; 单链表的归并排序 主要思想&#xff1a;递归 怎么理解&#xff1f;下面具体说明&#xff1a; 1.首先&#xff0c;我从整体的思考步骤说明&#xff1a;先分区&#xff0c;再排序&#…

3d里怎么让模型直接显示材质---模大狮模型网

在3D设计和渲染中&#xff0c;使模型直接显示材质是一个常见但也关键的需求。直接显示材质可以帮助设计师更直观地预览和编辑模型的外观&#xff0c;从而提高工作效率并确保最终效果符合预期。本文将介绍一些方法和技巧&#xff0c;帮助你在3D设计中实现模型直接显示材质的目标…

防火墙搭建内网 安装路由器

经典网络情况 也就是网吧 先配置网段 科普&#xff1a;子网掩码代表IP前面几位不能动 安装防火墙虚拟机 配置两个网卡 第一个 第二个桥接 设置子网掩码 虚拟机有DHCP 可以不用防火墙的DHCP 配置有网站的ip地址和网关 利用防火墙映射出去外网 然后看防火墙外网ip 然后…

C++三大特性(1)——继承

一.继承的概念及定义 概念 继承&#xff08;inheritance&#xff09;机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保存原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称为派生类。继承呈现了面向…