【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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达AndrewNg 关于Agent工作流的分享

主要观点 &#x1f393; 基于HumanEval的测试,使用智能体工作流确实能够显著提升大语言模型的表现,有时甚至超过下一代更强大的模型。&#x1f504; AI智能体设计包括四种模式&#xff1a;反思、工具使用、规划、多智能体协作。&#x1f3d7;️ 快速token生成对于提高AI智能体…

智慧公厕是智慧城市建设中不可或缺的一部分

智慧城市的数字化转型正在取得显著成效&#xff0c;各项基础设施的建设也在迅速发展&#xff0c;其中智慧公厕成为了智慧城市体系中不可或缺的一部分。作为社会生活中必要的设施&#xff0c;公共厕所的信息化、数字化、智慧化升级转型能够实现全区域公共厕所管理的横向打通和纵…

第12章 集合框架

一 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 一方面&#xff0c;面向对象语言对事物的体现都是以对象的形式&#xff0c;为了方便对多个对象的操作&#xff0c;就要对对象进行存储。另一方面&#xff0c;使用数组存储对象方面具有一些弊端&#xff0c;而Java 集合…

设计模式 -- 发布订阅模式

发布订阅模式&#xff1a; 订阅者把自己想订阅的事件注册到调度中心&#xff0c;当发布者发布该事件到调度中心&#xff0c;也就是该事件触发时&#xff0c;由调度者统一调度订阅者注册到调度中心的处理代码。 在javaScript 中我们一般使用事件模型来代替传统的发布订阅模式。 …

一文搞懂路由器2.4G和5G的区别,以及双频合一模式

我们知道&#xff0c;无线路由器是平时生活和工作中最常见不过的一个无线设备&#xff0c;通过它我们的手机、笔记本、智能电视、摄像头等&#xff0c;都可以接入互联网。 其实WiFi在1998年就开始使用了&#xff0c;当时仅仅是在欧美地区小范围使用&#xff0c;我们国家在2008年…

关于Ansible模块 ④

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 继《关于Ansible的模块 ①》、《关于Ansible的模块 ②》与《关于Ansible的模块 ③》之后&#xff0c;继续学习ansible常用模块之…

C++流程控制语句:嵌套循环案例分析【九九乘法表】

在C编程中&#xff0c;循环语句的嵌套是一种常见且强大的技术手段&#xff0c;它允许我们将多个循环结构相互嵌套&#xff0c;形成多维循环。不论是for循环、while循环还是do…while循环&#xff0c;均可以进行嵌套。 而在实践中&#xff0c;由于for循环具有明确的循环变量初…

[法规规划|数据概念]数据要素市场三月速递

“ 代表关注&#xff0c;市场活跃&#xff0c;发展迅速” 01—听听两会代表怎么说 在2024年的全国两会期间&#xff0c;数据要素作为新型的生产要素受到广泛关注&#xff0c;众多代表围绕数据要素市场化、立法、安全监管、人才培养及基础设施建设等方面&#xff0c;积极建言献策…

基于centos7安装docker+k8s+KubeSphere

实验环境&#xff1a;&#xff08;每个服务器推荐内存为8G&#xff09; 服务器 ip地址 主机名 centos7 192.168.80.1…

模型量化——NVIDIA——方案选择(PTQ、 partialPTQ、 QAT)

PTQ、 partialPTQ、 QAT 选择流程 PTQ、 partialPTQ、 QAT 咨询NVIDIA 官方后&#xff0c;他们的校正过程一致&#xff0c;支持的量化算子本质是一样的&#xff0c;那么如果你的算子不是如下几类&#xff0c;那么需要自己编写算子。参考TensorRT/tools/pytorch-quantization/py…

数据库入门-----SQL基础知识

目录 &#x1f4d6;前言&#xff1a; &#x1f4d1;SQL概述&&通用语法&#xff1a; &#x1f433;DDL&#xff1a; &#x1f43b;操作数据库&#xff1a; &#x1f41e;数据类型&#xff1a; &#x1f989;操作表&#xff1a; &#x1f9a6;DML: 语法规则&#x…

helm与k8基础

文章目录 一、helm二、K8S/K3S1.K8S基本组件1.1 资源对象1.2 核心组件1.3典型的创建 Pod 的流程1.4 Kubernetes 多组件之间的通信原理 三、容器运行时 Containerd1.查看当前k3s使用的容器运行时CRI2.K3S修改docker为运行环境3. Containerd 参考 一、helm Helm是Kubernetes的包…

吴恩达机器学习理论基础解读—线性模型(单一特征拟合)

吴恩达机器学习理论基础——线性模型 机器学习最常见的形式监督学习&#xff0c;无监督学习 线性回归模型概述 应用场景一&#xff1a;根据房屋大小预测房价 应用场景二&#xff1a;分类算法&#xff08;猫狗分类&#xff09; 核心概念&#xff1a;将训练模型的数据称为数…

使用C语言函数对数组进行操作

前言 在我们了解数组和函数之后&#xff0c;我们对数组和函数进行结合&#xff0c;之后完成一些操作吧 题目描述 杰克想将函数与数组结合进行一些操作&#xff0c;以下是他想要达到的效果&#xff0c;请你帮帮他吧&#xff01; 创建一个整型数组&#xff0c;完成对数组的操作 1…

Taro框架中的H5 模板基本搭建

1.H5 模板框架的搭建 一个h5 的基本框架的搭建 基础template 阿乐/H5 Taro 的基础模板

人民网至顶科技:《开启智能新时代:2024中国AI大模型产业发展报告发布》

​3月26日&#xff0c;人民网财经研究院与至顶科技联合发布《开启智能新时代&#xff1a;2024年中国AI大模型产业发展报告》。该报告针对AI大模型产业发展背景、产业发展现状、典型案例、挑战及未来趋势等方面进行了系统全面的梳理&#xff0c;为政府部门、行业从业者以及社会公…

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

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

5分钟了解清楚【osgb】格式的倾斜摄影数据metadata.xml有几种规范

数据格式同样都是osgb&#xff0c;不同软件生产的&#xff0c;建模是参数不一样&#xff0c;还是有很大区别的。尤其在应用阶段。 本文从建模软件、数据组织结构、metadata.xml&#xff08;投影信息&#xff09;、应用几个方面进行了经验性总结。不论您是初步开始建模&#xf…

Windows Server 2008添加Web服务器(IIS)、WebDAV服务、网络负载均衡

一、Windows Server 2008添加Web服务器&#xff08;IIS&#xff09; &#xff08;1&#xff09;添加角色&#xff0c;搭建web服务器&#xff08;IIS&#xff09; &#xff08;2&#xff09;添加网站&#xff0c;关闭默认网页&#xff0c;添加默认文档 在客户端浏览器输入服务器…

力扣LCR143---子结构判定(先序递归、Java、中等题)

题目描述&#xff1a; 给定两棵二叉树 tree1 和 tree2&#xff0c;判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 注意&#xff0c;空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 示例 1&#xff1a; 输入&#xff1a;tree…