【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.rhkb.cn/news/302509.html

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

相关文章

STM32中C编程引入C++程序

C具备类的创建思想很实用于实际场景多相似性的框架搭建&#xff1b;同种类型或相似类型的C的优势明显因此进行相互嵌套使用 需要在C中使用C类的话&#xff0c;你可以通过C的“extern "C"”语法来实现。这允许你在C代码中使用C的链接方式&#xff0c;而在C代码中使用…

实现RAG:使用LangChain实现图检索查询

你是不是有时会遇到这样的问题&#xff1a;你可能遇到的任何主题或问题&#xff0c;都有大量的文档&#xff0c;但是当尝试将某些内容应用于自己的用途时&#xff0c;突然发现很难找到所需的内容。 在这篇博文中&#xff0c;我们将看一下LangChain是如何实现RAG的&#xff0c;这…

kali基础渗透学习,永恒之蓝,木马实战

简介 kali的学习本质是在linux上对一些攻击软件的使用&#xff0c;只是学习的初期 先在终端切换到root用户&#xff0c;以便于有些工具对权限的要求 下载链接 镜像源kali 攻击流程 公网信息搜集 寻找漏洞&#xff0c;突破口&#xff0c;以进入内网 进入内网&#xff0c…

码蹄集部分题目(第五弹;OJ赛2024年第10期)

&#x1f40b;&#x1f40b;&#x1f40b;竹鼠通讯&#xff08;钻石&#xff1b;分治思想&#xff1b;模板题&#xff1a;就算几何平面点对问题&#xff09; 时间限制&#xff1a;3秒 占用内存&#xff1a;128M &#x1f41f;题目描述 在真空中&#xff0c;一块无限平坦光滑…

秋招算法刷题6

20240408 1.两数之和 &#xff08;时间复杂度是O&#xff08;n的平方&#xff09;&#xff09; public int[] twoSum(int[] nums, int target){int nnums.length; for(int i0;i<n;i){ for(int j1;j<n;j){ if(nums[i][j]target){ …

libVLC 提取视频帧使用OpenGL渲染

在上一节中&#xff0c;我们讲解了如何使用QWidget渲染每一帧视频数据。 由于我们不停的生成的是QImage对象&#xff0c;因此对 CPU 负荷较高。其实在绘制这块我们可以使用 OpenGL去绘制&#xff0c;利用 GPU 减轻 CPU 计算负荷&#xff0c;本节讲解使用OpenGL来绘制每一帧视频…

harmonyOS安装ohpm

下载 下载地址 HUAWEI DevEco Studio和SDK下载和升级 | 华为开发者联盟 初始化 注意&#xff1a;初始化ohpm前&#xff0c;需先完成node.js环境变量配置 1.解压文件&#xff0c;进入commandline-tools-windows-2.0.0.2\command-line-tools\ohpm\bin 2.执行&#xff1a; init.ba…

安卓开机启动流程

目录 一、整体框架二、流程代码分析2.1 Boot ROM2.2 Boot Loader2.3 Kernel层Kernel代码部分 2.4 Init进程Init进程代码部分 2.5 zygote进程zygote代码部分 2.6 SystemServer进程SystemServer代码部分 2.7 启动Launcher与SystemUI 三、SystemServices3.1 引导服务3.2 核心服务3…

C++进阶之路---何为智能指针?

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、为什么需要智能指针&#xff1f; 下面我们先分析一下下面这段程序有没有什么内存方面的问题&#xff1f;提示一下&am…

什么是HW,企业如何进行HW保障?

文章目录 一、什么是HW二、HW行动具体采取了哪些攻防演练措施三、攻击方一般的攻击流程和方法四、企业HW保障方案1.建意识2.摸家底3.固城池4.配神器5.增值守 一、什么是HW 网络安全形势近年出现新变化&#xff0c;网络安全态势变得越来越复杂&#xff0c;黑客攻击入侵、勒索病…

【腾讯云 TDSQL-C Serverless 产品体验】饮水机式使用云数据库

云计算的发展从IaaS&#xff0c;PaaS&#xff0c;SaaS&#xff0c;到最新的BaaS&#xff0c;FasS&#xff0c;在这个趋势中serverless(去服务器化&#xff09; 计算资源发展Physical -> Virtualisation -> Cloud Compute -> Container -> Serverless。 一、背景介绍…

【azure笔记 1】容器实例管理python sdk封装

容器实例管理python sdk封装 测试结果 说明 这是根据我的需求写的&#xff0c;所有有些参数是写死的&#xff0c;比如cpu核数和内存&#xff0c;你可以根据你的需要自行修改。前置条件&#xff1a; 当前环境已安装python3.8以上版本和azure cli并且已经登陆到你的账户 依赖安…

自己写的组件中使用v-model双向绑定

这里的时间选择表单是我写的一个组件&#xff0c;我想用v-model获取到实时的ref值。 代码&#xff1a; //父组件<TimePickerModal v-model:value"time" label-text"计划客面时间" /> const time ref(2024-04-09 15:20:00);//子组件<template>…

JRT判断数据是否存在优化

有一种业务情况类似下图&#xff0c;质控能做的项目是仪器关联的项目。这时候维护质控物时候开通项目时候要求加载仪器项目里面的项目&#xff08;没有开通的子业务数据的部分&#xff09;。对右边已经开通的部分要求加载仪器项目里面的项目&#xff08;有开通业务子数据的部分…

【C语言】扫雷小游戏

文章目录 前言一、游戏玩法二、创建文件test.c文件menu()——打印菜单game()——调用功能函数&#xff0c;游戏的实现main()主函数 game.c文件初始化棋盘打印棋盘随机布置雷的位置统计周围雷的个数展开周围一片没有雷的区域计算已排查位置的个数排查雷(包括检测输赢): game.h文…

基于ssm乐购游戏商城系统论文

摘 要 随着社会的发展&#xff0c;游戏品种越来越多&#xff0c;计算机的优势和普及使得乐购游戏商城系统的开发成为必需。乐购游戏商城系统主要是借助计算机&#xff0c;通过对信息进行管理。减少管理员的工作&#xff0c;同时也方便广大用户对个人所需信息的及时查询以及管理…

推荐一款自动化测试神器---Katalon Studio

Katalon Studio介绍 Katalon Studio 是一款在网页应用、移动和网页服务方面功能强大的自动化测试解决方案。基于 Selenium 和 Appium框架&#xff0c;Katalon Studio集成了这些框架在软件自动化方面的优点。这个工具支持不同层次的测试技能集。非程序员也可以快速上手一个自动…

maven profiles 配置

1.pom.xml中的文件配置 <profiles><profile> <!-- 开发/本地 默认激活 --><id>dev</id><activation><activeByDefault>true</activeByDefault></activation> <!--默认启用的是dev环境配置--><properties>&…

川川本人著作《Python3编程从零基础到实战》

在数字时代&#xff0c;Python已经成为了一种极为强大和灵活的编程语言&#xff0c;它的应用范围从网站开发到数据科学&#xff0c;再到机器学习和人工智能。无论你是一名编程新手还是希望深化已有技能的开发者&#xff0c;《Python3编程从零基础到实战》将成为你通往Python世界…

海外盲盒系统开发,盲盒出口成为企业新机遇

随着盲盒的兴起&#xff0c;国内消费市场形成了万物皆可盲盒的态势。并且&#xff0c;盲盒自带社交属性&#xff0c;也成为了年轻人的社交神器。 除了在国内&#xff0c;盲盒在海外也掀起了一股热潮&#xff0c;呈现出了爆发式增长形势&#xff0c;国内热门盲盒企业也出口到了…