【C++ unordered_set set 和 unordered_map 和 map】

news2024/12/23 23:36:11

文章目录

  • 前言
        • 简单介绍哈希表,哈希结构
        • 什么时候用哈希表
        • unordered_map操作
  • likou第一题 两数之和
        • unordered_set 基础操作
  • unordered_set 实现
  • 总结

前言

  • 今天重新打开力扣,看到以前的签到题两数之和,以前的方法是双指针暴力解法,偶然看到了哈希表的方法,让我想起了iOS的字典,也顺带学习了哈希表的使用,我这里仅仅限于自己用来写算法题,作以记录

简单介绍哈希表,哈希结构

  • 哈希表也叫散列表
  • 哈希表是一个数据结构
  • 散列表是数组结构
  • 它是用来:可以根据一个key值来直接访问数据,因此查找速度快
  • 说到访问数据,在最基本的几个数据结构中,数组肯定是查询效率是最高的。因为它可以直接通过数组下标来访问数据
  • 其实哈希表的本质上就是一个数组,它之所以叫哈希表,只能说它的底层实现是用到了数组,稍微加工,自立门户成了哈希表
  • 对于C++ 中的哈希表是unordered_set 和 unordered_map 而不是set 和 map

什么时候用哈希表

  • 一般哈希表都是用来快速判断一个元素是否出现在集合里。

unordered_map操作

  • 我在这里记录了一些刷题能用到的操作
  • 创建
std::unordered_map<int, int> hashTable;
    hashTable[0] = 4;
    hashTable[7] = 5;
  • 遍历
    • 对于哈希表的每一个元素,我们需要通过箭头语法来访问元素内部,结构如下

请添加图片描述

    • 可以看到内部元素的key需要用hashTable -> frist访问
    • value则是hashTable -> second
// 遍历
    for (auto i = hashTable.begin(); i != hashTable.end(); i++) {
        std::cout << i -> second << "\n";
    }
  • 查询1
    • C++ 对于哈希表的元素查询有2种方法
    • 对于查询在这里特别说一下,刚开始以为是查询里面的value,其实查询的对应的key,这和我学的字典,之前的数组区别很大
    • 查询一 hashTable.find(x) != hashTable.end(), 这=这句话的意思是在hashTable里面进行元素访问,如果访问x并没有到哈希表结束则找到了该元素,否则查找元素的失败x是对应的key而不是value
//     查询 1
    if (hashTable.find(7) != hashTable.end()) {
        std:: cout << "找到" << "\n";
    } else {
        std::cout << "查找元素失败" << "\n";
    }
  • 查询2 hash.count(x)
    • hash.count(x) , 该方法返回的是 0 和 1,对应的BOOL值就是否和正确
// 查询 2
    if (hashTable.count(4) == 1) {

    } else {
        std::cout << "查找元素失败";
    }
  • 删除元素 hashTable.erase(x);x 同样是key
if (hashTable.find(7) != hashTable.end()) {
        // 删除
        hashTable.erase(7);
        std:: cout << "找到并删除" << "\n";
    } else {
        std::cout << "查找元素失败" << "\n";
    }
  • 删除全部键值对,不是删除表。
  • 删除完之后表还是存在的,只是键值对全部没了。和销毁栈不一样
    请添加图片描述
 hashTable.clear();

likou第一题 两数之和

  • 今天刚好学到了就用这个思路写一下第一题,题目很简单,暴力事件复杂度在n平方,不值得
  • 哈希的时间复杂度低了很多。空间也就是多开了一个表
  • 这个题哈希表的思路就是在数组外开一个哈希表,遍历数组的同时在哈希表里找target减去数组当前元素的值,找到的话就返回,否则将数组当前下标作为value,元素内容作为key存入哈希,一旦找到就return
  • 思路很简单
class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashTable;
        for (int i = 0; i < nums.size(); i++) {
            auto self = hashTable.find(target - nums[i]);
            if (self != hashTable.end()) {
                return {self->second, i};
            }
            hashTable[nums[i]] = i;
        }
        return {};
    }
};
  • 哈希提交结果请添加图片描述
  • 暴力结果
    请添加图片描述
  • 对比之下哈希的速度快了很多

unordered_set 基础操作

  • unordered_set 和上面介绍的unordered_map的底层都是哈希结构的实现,unordered_map不会进行去重,unordered_set 则会进行去重,二者都不会进行排序
  • set 和 map的底层的实现是红黑树,相比于unordered_set 和上面介绍的unordered_map 的空间复杂度略微升高,这里我找了2篇博客介绍了它们的区别
  • unordered_set 和set区别
  • unordered_map 和 map的区别
//    Set
    // 排序但不去重
    std:: unordered_set<int> hashSet;
    hashSet.insert(1);
    hashSet.insert(5);
    hashSet.insert(3);
    hashSet.insert(2);
    hashSet.insert(3);
    hashSet.insert(3);
    hashSet.insert(4);
    // 遍历
    // c++   for语法
    
    for (auto e : hashSet)
    {
        std:: cout << e << "\n";
        e++;
    }
//    std:: cout << hashSet.size();
    //排序+去重
        std:: set <int> s;
        s.insert(3);
        s.insert(1);
        s.insert(8);
        s.insert(2);
        s.insert(5);
        s.insert(5);
        s.insert(5);
     
        //set<int>::iterator it = s.begin();
        auto it = s.begin();
        while (it != s.end())
        {
            std:: cout << *it << " ";
            it++;
        }
    std:: cout << std :: endl;

    
}

unordered_set 实现

请添加图片描述

  • 思路:只要出现重复的元素就返回false,一层循环数组元素,在数组外创建一个set,对比数组元素在set中一旦找到该元素,即说明在之前数组也出现了该元素,找不到就存入set。
  • 这个思路和两层循环查找是一样的,高效率就是在于它利用的封装好的哈希结构,所谓速度很快。
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> s;
        for (int x: nums) {
            if (s.find(x) != s.end()) {
                return true;
            }
            s.insert(x);
        }
        return false;
    }
};

总结

  • 对于unordered_set 和上面介绍的unordered_map 底层是哈希结构的实现,但map 和 set则是红黑树底层的实现,如果在写题的时候可以用到想到哈希结构的特点就可以使用 unordered_set 和 unordered_map
  • 这里只是简单的记录一下哈希思想,对于c++的散列表没有深入了解
  • 简单的记录,并没有深入了解哈希这个结构,对于C++ Java这些语言都有封装好的库,相对于C语言方便许多,C语言可以数组模拟哈希,但实在是太麻烦了
  • 就我所知iOS 的底层也有接触到哈希表,以后了解

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

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

相关文章

asp.net校园二手物品交易网站

目录 摘 要 Ⅰ Abstract Ⅱ 第一章 概述 1 1.1网站的开发背景 1 1.1.1学生二手物品交易置换网站的开发背景 1 1.1.2学生二手物品交易活动的现状 1 1.2 学生二手物品交易置换网站的研究方向和内容 2 1.2.1研究方向 2 1.2.2研究内容 2 1.3 学生二手物品交易置换网站的设计目标 2…

transformer中QKV的通俗理解(剩女与备胎的故事)

用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下 参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制&#xff08;上&#xff09;在线激情讲解transformer&Attention注意力机制&#xff08;上&…

SpringCloud全系列知识(5)——微服务的部署(Docker)

微服务的部署&#xff08;Docker&#xff09; 一 初识Docker 1.项目部署问题 大型项目组件较多&#xff0c;运行环境较为复杂&#xff0c;部署和维护困难依赖关系复杂&#xff0c;容易出现兼容性问题开发&#xff0c;测试&#xff0c;生产环境有差异 2.解决依赖的兼容问题 …

[附源码]Python计算机毕业设计Django疫情期间小学生作业线上管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

差分方程解的稳定性

Heine定理 存在的充要条件是: 取定义域内的任意数列,有 差分的定义 考虑离散型变量 一阶差分为: 二阶差分为: 线性差分方程的解 非齐次差分方程的解 满足初始条件的n阶非齐次线性差分方程 的解是存在且唯一的 非齐次线性差分方程的通解结构:齐次差分方程的解 线性相关与…

提升规则自治能力与原生分析能力、支持视频流接入处理

11 月&#xff0c; eKuiper 团队转入 1.8.0 版本的开发周期之中&#xff0c;目前已完成了一部分实用的新功能&#xff1a;添加了视频流 source&#xff0c;将边缘流式处理能力扩展到视频流领域&#xff0c;可以处理摄像头的视频流或者网络中的直播视频流&#xff1b;发布了通用…

[附源码]Python计算机毕业设计Django智能家电商城

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

苹果iOS 16.2/iPadOS 16.2 RC版发布:隔空投送10分钟限制全球上线

今日&#xff0c;苹果向用户推送了iOS 16.2/iPadOS 16.2 RC候选版更新&#xff0c;内部版本号为20C65。 本次更新主要包括以下改进和错误修复&#xff1a; 一、隔空投送10分钟限制在全球上线&#xff0c;原本的“所有人”选项改为“所有人&#xff0c;10分钟”&#xff0c;超过…

从事功能测试1年,裸辞1个月,找不到工作的“我”怎么办?

做功能测试一年多了裸辞职一个月了&#xff0c;大部分公司都要求有自动化测试经验&#xff0c;可是哪来的自动化测试呢&#xff1f; 我要是简历上写了吧又有欺诈性&#xff0c;不写他们给的招聘又要自动化优先&#xff0c;将项目带向自动化不是一个容易的事情&#xff0c;很多…

守护网络安全的第一道门—防火墙

防火墙作为网络安全领域的第一道门&#xff0c;可以有效的过滤和阻止未经允许的流量进出&#xff0c;选择性地阻止或允许数据包。防火墙通常用于帮助阻止恶意活动并防止专用网络内外的任何人进行未经授权的 Web 活动。在网络安全领域起到了至关重要的作用。 防火墙有什么作用…

引擎入门 | Unity UI简介–第2部分(6)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 10.点击按钮时显示对话框 11.增加一个关闭按钮 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;…

eclipse+tomcat+spring mvc开发笔记

一:Tomcat安装 在.net web开发中,微软再一次向你展示了一站式马赛克配置,你只需要轻轻一点按钮,发射。。。一个带有bootstrap框架的页面就呈现在你的面前,在 java中就没有这么好的事情了,基本都是高清无码。 1. 下载地址 http://mirrors.hust.edu.cn/apache/tomcat/tomc…

v1.9.1 进行中:MQTT X CLI 支持自动重连及保存和读取本地文件

十一月初&#xff0c;MQTT X 团队发布了 1.9.0 版本&#xff1a;MQTT X CLI 命令行客户端实现支持 MQTT 的性能测试&#xff0c;桌面端应用新增了关于学习 MQTT 的帮助页面等&#xff0c;此外还进行了一些使用优化和问题修复。 目前&#xff0c;团队正专注于 1.9.1 版本的开发…

电脑上如何禁止一切弹窗广告?永久关闭桌面弹出广告

现在日常生活工作离不开电脑&#xff0c;在用电脑办公的时候&#xff0c;弹窗广告总会打扰我们的办公&#xff0c;即使关闭弹窗也无用&#xff0c;很是让人讨厌&#xff0c;电脑上如何禁止一切弹窗广告&#xff1f;本篇教程教您如何快速关闭弹窗广告。如果您在使用电脑过程中&a…

人机界面石油行业的应用:如何构建自动化石化罐区储运监控系统?

一、应用背景 在石油化工企业的生产过程中&#xff0c;运输和储存的大部分介质和产品都是流体&#xff0c;为了保证加工过程的正常运行&#xff0c;企业通常建有大量各种储藏罐的罐区。随着工业自动化技术的发展和计算机技术在罐区控制系统中的应用&#xff0c;罐区自动化系统…

antd-vue 累加表单编辑和删除

一、业务场景&#xff1a; 最近在使用Antd-Vue组件库的时候&#xff0c;发现在累加表单 时没有直接可以用的&#xff0c;必须自己在官网上手动合并几个才能实现&#xff0c;为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、具体实现步骤&#xff1a; <temp…

信息安全简介

文章目录Basics of Information SecurityUnsecure SystemsEvolution of SecurityBuild a Security ProgramComputer Security Model: CIA triadThe OSI security architectureFundamentals of Security DesignReferencesBasics of Information Security 我们掌握的信息越多&am…

数字逻辑·时序线路设计【状态化简与编码】

化简原理 等价状态: 1、必要条件&#xff1a;在同样的输入作用下&#xff0c;有相同的输出 2、同样的输入条件下&#xff0c;相应的次态彼此等价 等价次态&#xff1a; 1、对应的次态相同 2、次态为两个现态本身或交错 3、两个次态为状态对封闭链中的一对 4、两个次态的某一后…

图书馆座位预约小程序毕业设计,图书馆座位预约系统设计与实现,微信小程序毕业设计论文怎么写毕设源码开题报告需求分析怎么做

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序预约订座小程序&#xff0c;前台用户使用小程序&#xff0c;后台管理使用JavaMysql开发&#xff0c;后台使用了springboot框架&#xff1b;通过后台添加座位类型、座位号&#xff0c;用户通过…

通过分割受损的叶子自动检测昆虫捕食(matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…