首页 > 编程语言 >C++| STL之unordered_map(哈希表)和map

C++| STL之unordered_map(哈希表)和map

时间:2024-07-25 17:57:02浏览次数:12  
标签:map key insert STL hmap 哈希 unordered

前言:Leetcode题目中有一个哈希表的专题,自己实现的话没必要,可以直接用STL现成的unordered_map函数,提到unordered_map就不得不提到map,于是有了此篇相关知识点的汇总。

unordered_map和map

key和value

unordered_map和map都是一个将key和value关联起来的容器,可以根据key来查找对应的value,类似于其它语言中的字典。

其中key是唯一的,key和value的数据类型可以不同。

unordered_map

unordered_map其实就是stl提供的哈希表的工具。

使用

头文件:

#include<unordered_map>

声明和初始化:

unordered_map<int, int> hmap;// 关键字、键对值的类型都是int
unordered_map<int, int> hmap{ {1,5},{2,6},{3,7} };
unordered_map<int, int> hmap{ {{1,5},{2,6},{3,7}},3 };
unordered_map<int, int> hmap1(hmap);// 通过复制已经初始化的哈希表来构建新的表

添加元素:

// 1. 下标
hmap[4] = 8;
// 2. insert函数,同一个位置第二次insert会失败
hmap.insert({ 5,9 });
// 3. insert+pair
hmap.insert(make_pair(6, 10));
pair<int, int>p(7, 11);
hmap.insert(p);
// 4. emplace函数,相比与insert不需要手动创建键对值
hmap.emplace(8, 12);

访问:

int a=hmap[4];// 下标
int b=hmap.at(4);// at

迭代器遍历:

for(unordered_map<int,int>::iterator iter=hmap.begin();iter!=hmap.end();iter++)
          cout<<"key "<<iter->first<<" value "<< iter->second;

查找:

if(hmap.find(x) != hmap.end())
	cout<<x<<"存在"<<endl

删除元素:

hmap.erase(5);// 删除key为5的内容
hmap.clear();// 清空

容量:

bool isEmpty = hmap.empty();
int size = hmap.size();

交换:

hmap1.swap(hmap2);// 交换两个哈希表的内容

map

原理对比unordered_map

map的特点是有序性,unordered_map的特点是无序性。

原因在于实现原理,map实现原理是红黑树,具有自动排序,内部的所有元素都是有序的,和插入顺序相同;unordered_map实现原理是哈希表,所以内部元素排序是无序的。

运行效率上,unordered_map查找速度比map快,但建立比较废时间。
占用内存上,map红黑树需要额外的空间保存每个节点的父节点和孩子节点,空间占用率会高。

使用对比unordered_map

map的话,常见的使用和unordered_map差不多,但是有些地方要注意。

头文件和声明类型需要从unordered_map写成map。

#include<map>
map<int, int> mp;

map是有序的,声明的时候可以说明排序准则,一般按照键(key)的升序进行排序的。

// 1. 降序的map
map<int, string, greater<int>> mpDesc;
// 1. 自定义排序准则
// 这个是结构体里面的,和sort的还不太一样,sort是函数只对线性容器进行排序
struct Cmp {  
	// 这里的const一定不能省略
    bool operator()(const int& a, const int& b) const {  
        return a>b;  
    }  
};   
std::map<int, int, Cmp> mpDesc;// 降序

因为map是有序的,所以迭代器遍历的时候也是按照key的顺序来的。

标签:map,key,insert,STL,hmap,哈希,unordered
From: https://blog.csdn.net/qq_40306845/article/details/140691292

相关文章

  • 存在重复元素 II-哈希表
    题目描述:个人题解:从左到右遍历数组nums,当遍历到下标i时,如果存在下标j<i使得nums[i]=nums[j],则当i−j≤k时即找到了两个符合要求的下标j和i。如果在下标i之前存在多个元素都和nums[i]相等,为了判断是否存在满足nums[i]=nums[j]且i−j≤k的下标j,应该在这......
  • 在Python中字典是如何通过哈希表实现的以及哈希冲突是如何解决的
    哈希表(散列表)的工作原理哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。它通过哈希函数将输入的键(key)映射到表中的一个位置(即索引或槽位),从而以接近常数时间复杂度进行查找、插入和删除操作。哈希表的基本工作流程如下:哈希函数:哈希函数接受一个输入(键),并......
  • STL 容器以及各函数及其复杂度
    主要是实质、函数、性质。如果没有特殊提出,那么是常数复杂度。vector相当于变长数组。支持随机访问(可以直接查询\(v_i\)),但是不任意位置\(O(1)\)插入。通常为了保证效率,只在末尾加入删除元素。size:返回实际长度(通常声明的长度会大于实际长度),也就是包含的元素个数。empty:......
  • 手写Semaphore信号量
    publicclassMySemaphore{privateSyncsync;publicMySemaphore(intcount){sync=newSync(count);}publicvoidacquire(){sync.acquireShared(1);}publicvoidrelease(){sync.releaseShared(1);......
  • 如何使用DataFrameMapper删除特定列中具有空值的行?
    我正在使用sklearn-pandas.DataFrameMapper来预处理我的数据。我不想输入特定列。如果此列是Null,我只想删除该行。有没有办法做到这一点?虽然DataFrameMapper没有内置方法来删除具有空值的行,但你可以通过在DataFrameMapper管道之前使用P......
  • std的map或者set中,比较浮点类型二维三维数据
    在map和set中,如果比较对象是二维或者三维数据,需要把二维三维数据的浮点数转换为比较精度。如果比较精度是0.001,那么数据的精度也必须是0.001,不然会出现如下情况:比较函数 structPoint001Comp{booloperator()(constPoint*l,constPoint*r)const{i......
  • 算法笔记|Day6哈希表基础II
    算法笔记|Day6哈希表基础II☆☆☆☆☆leetcode454.四数相加II题目分析代码☆☆☆☆☆leetcode383.赎金信题目分析代码☆☆☆☆☆leetcode15.三数之和题目分析代码☆☆☆☆☆leetcode18.四数之和题目分析代码☆☆☆☆☆leetcode454.四数相加II题目链接:leetco......
  • 一文说透ConcurrentHashMap及大厂面试题
    23年毕业半年被裁后,一个月斩获大厂offer,“跟着周哥走,offer手里有”。文中有周哥50+场面试总结出的必会面试题。本期说一下ConcurretHashmap及相关知识点的面试题及答案。注:接下来的内容来自本人整理的面试秘籍。点击此处,免费获取面试秘籍jdk1.7中和jdk1.8中ConcurretH......
  • ava 集合框架全解析:Collection vs Collections,Comparable vs Comparator,HashSet 工作
    Java中的集合框架是开发过程中不可或缺的一部分,但初学者常常会混淆其中的术语,特别是Collection和Collections。这篇博客将详细介绍它们之间的区别,并进一步探讨Comparable和Comparator、HashSet的工作原理,以及HashMap和Hashtable的区别。Collection和Collecti......
  • js-数组内置函数-filter、map、forEach、reduce
    1、过滤数组-filter筛选数组元素,并生成新数组//过滤出分数为60分以上的数据<script>constarr=[{'name':'张三','score':80},{'name':'张六','score':50},{'name':'李四','scor......