首页 > 其他分享 >std::unorder_map知识点

std::unorder_map知识点

时间:2025-01-17 19:28:07浏览次数:3  
标签:std 知识点 自定义 map unorder 键值 散列 unordered

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、std::unorder_map知识点

之前做的题目好像提到过unorder_map的底层实现。

unorder_map和map的区别:

看了文章,map的底层使用的红黑树,(红黑树非严格平衡二叉搜索树,AVL是严格平衡二叉搜索树),unordered_map的底层使用的是哈希表。

资料原文:

map: map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。
unordered_map: unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的。哈希表详细介绍

3、优缺点以及适用处

map:

优点:

有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
红黑树,内部实现一个红黑书使得map的很多操作在lgn的时间复杂度下就可以实现,因此效率非常的高

缺点: 空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点、孩子节点和红/黑性质,使得每一个节点都占用大量的空间

适用处:对于那些有顺序要求的问题,用map会更高效一些

unordered_map:

优点: 因为内部实现了哈希表,因此其查找速度非常的快

缺点: 哈希表的建立比较耗费时间
适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

参考文章:C++:map和 unordered_map

这篇文章主要的不是熟悉和了解map和unordered_map的使用。主要是了解unordered的一个特性,就是在代码中看到的这样一个写法

std::unordered_map<LinkInfo, size_t, LinkInfo::HashFunction> interserctionIndex;

基于之前的理解,map应该是两个参数或者称为成员,即key值和value值。

但是这个写法有了第三个参数,查一下资料,查到这个叫【使用自定义的散列函数对象】

基于此问了copilot,unordered_map使用自定义的散列函数对象

你可以使用自定义的散列函数对象来创建 std::unordered_map。以下是一个示例代码,展示了如何使用自定义的散列函数对象:

#include <iostream>
#include <unordered_map>
#include <string>

// 自定义散列函数对象
struct CustomHash {
    std::size_t operator()(const std::string& key) const {
        std::size_t hash = 0;
        for (char c : key) {
            hash = hash * 31 + c;
        }
        return hash;
    }
};

int main() {
    // 使用自定义散列函数对象创建 unordered_map
    std::unordered_map<std::string, int, CustomHash> myMap;

    // 插入元素
    myMap["apple"] = 1;
    myMap["banana"] = 2;
    myMap["cherry"] = 3;

    // 访问元素
    std::cout << "apple: " << myMap["apple"] << std::endl;
    std::cout << "banana: " << myMap["banana"] << std::endl;
    std::cout << "cherry: " << myMap["cherry"] << std::endl;

    return 0;
}

在这个示例中,我们定义了一个自定义的散列函数对象 CustomHash,并使用它来创建 std::unordered_map。这样,你就可以使用自定义的散列函数来处理键值对了。

总结:感觉就是自己写了个hash表的计算方式。

但是还遗留了疑问,如果hash冲突了怎么解决?

三、

3.1


总结

未完待续

标签:std,知识点,自定义,map,unorder,键值,散列,unordered
From: https://blog.csdn.net/2301_77560238/article/details/145166278

相关文章

  • rustdesk专用服务器/月付8元、京东BGP线路10M带宽
       今天给大家推荐一夸Rustdesk专用服务器(并不是官方专门为了为了搭建rustdesk出的套餐,而是根据rustdesk搭建要求作者找到的),因为这个额服务器的带宽10M,并且还是京东机房BGP线路,所以稳定性肯定没有问题。并且我搭建了这个服务器,经过测试自己使用有时候延迟30ms左右,甚至更低。......
  • 【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍DERT中匈牙利
    【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍DERT中匈牙利匹配算法的具体流程?【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据…本篇介绍DERT中匈牙利匹配算法的具体流程?文章目录【大厂面试AI算法题中的知识点】方向涉及:ML/DL/C......
  • unordered_map-STL容器
    时间复杂度和空间复杂度......
  • 在C++中std::string 和string有啥区别呀?
    在C++中,std::string和string实际上是同一个类型,只是它们的命名空间(namespace)不同。具体来说:(我说为啥在写代码的时候都有个usingnamespacestd;语句我还以为是闹着玩.)std::string明确指定了string类型位于std命名空间中。string是std::string的简写,但要使......
  • std::promise 和 std::packaged_task
    std::promise和std::packaged_task都是C++11标准库中用于管理异步操作的工具,它们都允许你通过std::future获取异步操作的结果。然而,它们在设计目的和使用场景上有显著的区别。以下是对两者的详细比较:std::promise主要用途手动设置结果:std::promise 提供了一种机制来手......
  • 手机端rustdesk如何进行配置
    安装rustdesk客户端以后,可以按照下图填写配置信息手机版也是可以快速导入导出,可以方便从其他设备或者客户端直接导入配置信息,然后在本软件进行导入或者导出......
  • rustdesk如何开启远程教程
    手机端在软件底部选择【共享屏幕】,在共享屏幕里面选择启动服务。主控和被控手机同时都配置好了ID服务器的信息以后,在软件底部选择【连接】然后输入远程ID,选择连接就行了。提示输入密码,可以查看一下被控客户端的密码,或者可以给被控客户端设置固定密码。......
  • 地信考试知识点→196个GIS名词介绍
    01.  地理信息系统:GIS作为信息技术的一种,是以计算机技术为依托,以具有空间内涵的地理数据为处理对象,运用系统工程和信息科学的理论,采集、存储、显示、处理、分析、输出地理信息的计算机系统,为规划、管理和决策提供信息来源和技术支持。简单地说,GIS就是研究如何利用计算机技术......
  • 《ESP32-S3使用指南—IDF版 V1.6》第二章 常用的C语言知识点
    第二章常用的C语言知识点1)实验平台:正点原子DNESP32S3开发板2)章节摘自【正点原子】ESP32-S3使用指南—IDF版V1.63)购买链接:https://detail.tmall.com/item.htm?&id=7684993426594)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/esp32/ATK-DNESP32S3.html......
  • 【C++17 library features】深入解析 C++17 标准库中的文件系统 (std::filesystem)
    目录标题第一章:std::filesystem概述1.1C++17引入文件系统库的背景和动机1.2std::filesystem的主要功能和模块结构1.2.1路径管理(PathManagement)1.2.2文件和目录操作(FileandDirectoryOperations)1.2.3文件属性与状态(FileAttributesandStatus)1.2.4错误处理......