- 博客(41)
- 收藏
- 关注
原创 c++STL——哈希表封装:实现高效unordered_map与unordered_set
本文介绍了如何使用哈希表封装C++中的unordered_map和unordered_set容器。首先,文章回顾了哈希表的实现原理,并指出C++标准库中的这两个容器底层也是基于哈希桶实现的。接着,文章详细讨论了如何改进哈希表的底层框架,特别是通过泛化数据类型和使用模板参数KeyOfT来提取关键字,从而支持unordered_map和unordered_set的封装。文章还探讨了哈希表迭代器的实现,指出哈希桶的迭代器是单向的,因为哈希桶底层使用的是单链表。迭代器的实现需要包含指向节点的指针和指向哈希表的指
2025-05-14 22:13:22
721
1
原创 c++进阶——哈希表的实现
本文介绍了哈希表的基本概念及其实现方式。哈希表通过哈希函数将关键字映射到存储位置,以实现快速查找和插入。C++ STL库中的unordered_set和unordered_map基于哈希表实现,与基于红黑树的set和map相比,哈希表在搜索和插入效率上更高,但无序。哈希表的关键在于将关键字转化为整型并通过哈希函数映射到表中,这可能导致哈希冲突。解决冲突的常用方法有开放定址法和链地址法。开放定址法通过线性探测等方式解决冲突,而链地址法则通过链表或红黑树处理冲突。哈希函数的选取对哈希表的性能至关重要,常见的哈希
2025-05-13 23:18:04
881
2
原创 c++STL——set和map的使用
这里的T其实就是key,这里写的确实会令人误解。因为本质上二叉树对应的这些关联式容器都是以key作为关键字来进行查找、删除等操作的。这里我们跟着看一下文档就好了。如果到后期自行实现了改过来就好。这个Compare模板参数类型给了一个less< T >,这是干什么用的呢?这个是用来规定搜索树的规则的。我们默认的规则是对于一个搜索树,右子树的key应该比根节点的大,左子树的key比根节点要小。默认传入的是小于的比较逻辑。但是如果想要反过来,需要传入大于的比较逻辑。比较逻辑本质是仿函数。
2025-05-04 15:53:27
650
3
原创 c++STL——stack、queue、priority_queue的模拟实现
c++STL——stack、queue、priority_queue的模拟实现
2025-04-22 13:38:53
1129
4
原创 Linux——入门常用基础指令
Linux是一个开源的操作系统,市面上有很多种版本。我们可以根据自己的需求进行选择。当然在学习的初期我是选择了Centos 7.6进行学习。我们大部分人的电脑装的都是Windows系统,Linux是另外一个操作系统。我们可以选择将系统重装为Linux,但是这个代价太大了。还可以选择使用虚拟机,但是当前知识储备有限,使用虚拟机难度较大。还可以选择使用云服务器,并且使用Xshell软件进行登录云服务器。这个代价并不是很大,所以我选择了这个。需要注意的是:XShell 下的复制粘贴。
2025-04-21 19:39:56
955
原创 c++STL——vector的使用和模拟实现
对于STL中各类容器的学习其实是很相似的,因为c++的封装性。虽然是不同的容器,但是c++标准库在实现的时候是对各类的容易实现了一些一样的接口,我们只需要关注其封装的接口的使用即可。所以各类容器的操作是很类似的。而对于vector其实是一个类模板,其底层的实现本质还是顺序表。只不过与string的底层实现是略有区别。更大的不同是vector中存储的元素不仅仅是一些内置类型,也可以是类,如string,甚至是vector类。
2025-04-17 21:38:42
641
原创 Leetcode——137 260找出只出现一次的数
算出数组中所有数字第i位1的出现次数(Onenum),如果是3的倍数,那么ans的这一位就是0,正好是Onenum取余3的结果。如果按照刚刚的思想来分类也是不太可能的,因为分类的情况下,可能出现一次的数据和出现三次的数据会被分到一块,这是很难办的。以此类推,我们很容易得知:对于整个数组来说,第i位出现的0和1的次数一定是一个为3的倍数,一个比3的整数倍还多一个。这题对于引入的例子也是修改了一点:只有一个数字出现一次,其他的会出现3次,找出只出现一次的数据,并且要求线性时间复杂度,常数级别空间复杂度。
2025-04-14 23:36:42
803
原创 Leetcode12 13——罗马数字与整数之间的转换
2.如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。你不能多次附加 5 (V),50 (L) 或 500 (D)。1.如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
2025-04-10 15:28:39
898
原创 Leetcode 69——不使用sqrt函数情况下求平方根整数部分(暴力求解法和二分查找法)
时间复杂度为O(LogX),其实很好理解,如果x比较大,那么跑的次数会非常接近刚刚的那个数46431,其实也就是x的平方根整数部分,那效率还是比较低的。就比如我要找10的平方根,从10开始找才是更快的,从50000开始为上界那就不太行了。所有类型的数据最大的平方根也不超过50000,所以我们做一个规定,如果传入的x小于等于50000,就让上界为x,反之为50000。就比如找90000的平方根,暴力查找要找300次,而二分查找只需要14次(大致计算),这个效率差是非常大的。很明显,这个思路是可行的。
2025-04-10 13:25:25
823
原创 c语言之动态内存管理
栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元⾃动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运⾏函数⽽分配的局部变量、函数参数、返回数据、返回地址等。堆区(heap):⼀般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配⽅式类似于链表。数据段(静态区):(static)存放全局变量、静态数据。程序结束后由系统释放。
2025-03-04 19:41:56
740
原创 c语言之数据在内存中的存储
源码:源码就是数据的二进制数字。这里我们要知道的是,数字有正负之分,所以在内存中,对于有符号数字,数字的最高比特位是符号位。1代表负数,0代表整数。int a=1;int b=-1;正数的源码、反码、补码是一致的a的源码 00000000 00000000 00000000 00000001b的源码 10000000 00000000 00000000 00000001反码:反码就是数据的源码除符号位以外,其他取反。
2025-03-01 01:36:12
1031
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人