Is this you? As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.
Claim your profile
Articles by class Ptr
C++ move semantics from scratch
Home Written on 2022-01-14 Today I'd like to propose a narrative for building an intuition for move semantics in C++ by describing a world in which they don't exist and how they naturally appear as a solution for pre-C++11 problems. My goal is to provide a clear understanding of what move semantics are, without any hand waviness.
【C++】哈希表的模拟实现及 unordered_set 和 unorderded_map 的封装
前言 上一篇文章中讲到了哈希的概念和STL中关于哈希容器的使用,并且在后面对开散列进行了模拟实现,那么在这一篇文章中在开散列的基础上进行改造成哈希表,并且在哈希表的基础上封装 unordered_set 和 unordered_map。 一、哈希表的模拟实现 1.1.1 模板参数列表的改造 K:表示关键码类型 T:不同容器V的类型不同,如果是unordered_map,K代表一个键值对,如果是unordered_set,T 为 K。 KOfT: 因为V的类型不同,通过value取key的方式就不同,详细见 unordered_map/set的实现 HF: 哈希函数仿函数对象类型,哈希函数使用除留余数法,需要将Key转换为整形数字才能取模 template<class K, class T , class KOfT , class HF> class hash_table; 1.1.2 增加迭代器操作 template<class K, class T, class KOfT, class HF> class hash_table; template<class K, class...
【C++】哈希-CSDN博客
1. unordered系列关联式容器 STL提供了底层为红黑树结构的一系列关联式容 这里介绍 unordered_set 和 unordered_map unordered_map 是存储<key, value>键值对的关联式容器,其允许通过 key 快速的索引到与 其对应的 value unordered_map 容器通过 key 访问单个元素要比 map 快,但它通常在遍历元素子集的范围迭 代方面效率较低 unordered_map 实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value 它的迭代器至少是前向迭代器 重复数据可以去重 unordered_set 允许通过 key 快速的索引是否存在 重复数据可以去重 删除,查找,插入,效率都很快 2. unordered_map 的接口说明 函数声明 1. bool empty() const 2. size_t size() const 功能介绍 1. 检测unordered_map是否为空 2. 获取unordered_map的有效元素个数 函数声明 1. iterator begin() 2.
【C++】开散列实现unordered_map与unordered_set的封装-CSDN博客
> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:手撕哈希表的闭散列和开散列 > 毒鸡汤:谁不是一边受伤,一边学会坚强。 > 专栏选自:C嘎嘎进阶 > 望小伙伴们点赞👍收藏✨加关注哟💕💕 🌟前言 我们已经模拟实现了哈希表,当然需要用哈希表来封装相关容器,最初的map和set封装是用红黑树,所以我们就不再封装了map和set,来封装它们的同胞兄弟unordered_map与unordered_set。对比前面map和set的封装还是比较简单的,咱们走起吧!!! ⭐主体 学习开散列实现unordered_map与unordered_set的封装咱们按照下面的图解: 概念: unordered_map其实就是与map相对应的一个容器。学过map就知道,map的底层是一个红黑树,通过中序遍历的方式可以以有序的方式遍历整棵树。而unordered_map,正如它的名字一样,它的数据存储其实是无序的,这也和它底层所使用的哈希结构有关。而在其他功能上,unordered_map和map基本上就是一致的。 特点: unordered_map是用于存储<key,...
C++利用开散列哈希表封装unordered_set,unordered_map-CSDN博客
一.前言 1.之前我们已经实现了开散列的哈希表,今天我们来用它封装unordered_set,unordered_map 2.本文的封装比利用红黑树封装set和map更加复杂 建议大家先去看我的红黑树封装set和map再来看本文 因为有很多地方跟红黑树封装set和map时是同样的思路和方法,所以本文不会太去赘述一遍 namespace hash_bucket { template<class K> struct HashFunc { size_t operator()(const K& key) { return (size_t)key; } }; template<> struct HashFunc<string> { size_t operator()(const string& key) { size_t hash = 0; for (auto e : key) { hash *= 131; hash += e; } return hash; } }; template<class K, class V> struct HashNode { HashNode* _next;...
用C++实现一个哈希桶并封装实现 unordered_map 和 unordered_set
目录 HashTable.h MyUnorderedMap.h MyUnorderedSet.h 哈希桶,又叫开散列法。开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。具体如下图例: 哈希桶的实现原理 首先,思路是用 vector 来作为基础容器,里面存储的数据类型是一个结构器结点类型,结点中存储模板类型的数据和 _next 指针。当要插入数据的时候,先根据这个数据利用除留余数法计算出它的 hashi,然后再头插到对应 vector 的位置。 一般设置哈希桶的负载因子为1,当哈希桶的负载因子恰好等于 1 的时候,就要进行扩容。哈希表的扩容必须要异地扩容并且将原哈希桶中的数据再次挨个插入到新的哈希桶中,最后将这个哈希桶的数据与原来的哈希桶交换。当然,析构函数也要自己来写,因为必须将所有结点挨个释放! 哈希表的查找。哈希表的查找效率是非常高的,几乎接近于 O(1)。先计算出要查找数据的 hashi,再根据以 hashi...
【C++】unordered_map,unordered_set模拟实现-CSDN博客
喜欢的点赞,收藏,关注一下把! 上一篇文章我们把unordered_map和unordered_set底层哈希桶的知识也都说清楚了,今天就根据哈希桶模拟实现出unordered_map和unordered_set。 这里如果看过以前文章【C++】map和set的模拟实现,应该会觉得简单。 因为unordered_map和unordered_set底层都是哈希桶,因此我们只需要一个哈希桶就好了。所以哈希桶的代码我们做一下修改,让它能够同时满足unordered_map和unordered_set的需求。 unordered_map是KV模型,unordered_set是K模型,因此先把链表节点改一下,传个T,这个T既可以是KV,也可以是K。 template<class T> struct HashNode { T _data; HashNode<T>* _next; HashNode(const T& data) :_data(data) ,_next(nullptr) {} };...
C++进阶--哈希表模拟实现unordered_set和unordered_map-CSDN博客
一、定义哈希表的结点结构 这里直接拿自己写的开散列(原先是KV模型)改造下,使其既可兼容K模型,也可兼容KV模型: 哈希表里面具体存的是什么类型的元素,是由模板参数T来决定: 如果是unordered_set,传给T就是Key 如果是unordered_map,传给T的就是pair<const Key, V> 哈希表结点结构: template<class T> struct HashNode { HashNode<T>* _next; T _data; HashNode(const T& data) :_next(nullptr) ,_data(data) {} }; 二、定义哈希表的迭代器 迭代器的结构: 注意:哈希表迭代器封装的是结点指针和哈希表指针,因为要在哈希表中找下一个桶,所以要用到哈希表指针 template<class K, class T, class KeyOfT, class Hash > class HashTable; template<class K, class T,class Ref,class Ptr, class KeyOfT, class...
封装unordered_map和unordered_set_小何只露尖尖角的博客-CSDN博客
先前用红黑树封装出了map和set,现在就要用哈希来封装unordered_map和unordered_set(为了简化名称,后面称u_map和u_set),u_map和u_set在学习map时曾了解过,只知道是无序,我还在想,不能排序有啥用呢?原来用于查找数据效率高得很。有了封装map和set的经历,下面的封装就好理解多了,难点基本上都是迭代器和模板参数。 一 模板参数 下图为哈希表接收的模板参数 本文的哈希是开散列的,因为开散列可以更好地解决哈希冲突,所以哈希表中存的就是每个桶中第一个节点的指针,而T就是节点用于存各种数据类型的,也就是说u_map和u_set给哈希表模板传的第二个模板参数就是想要哈希表节点存的类型。接来下看看两个容器在节点存的类型。 节点类内部实现 template<class T>//T为节点所存数据 struct HashNode { HashNode(const T& data) :_data(data) , _next(nullptr) { ; } T _data; HashNode<T>* _next; }; u_map实例化的哈希表变量...
由[哈希/散列]模拟实现[unordered_map/unordered_set] (手撕迭代器)
1.迭代器分析 2.细节处理 以下两篇文章均为笔者的呕心沥血 想要搞懂本篇文章的uu请自行查阅 哈希/散列的细节实现 哈希/散列–哈希表[思想到结构][==修订版==] 手撕迭代器的细节处理 模拟实现map/set[改编红黑树实现map/set容器底层] 3.完整代码 #pragma once #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> #include <vector> #include <algorithm> #include <array> #include <time.h> #include <queue> #include <stack> #include <string> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <functional> #include <assert.h> using namespace std;...
【C++】unordered_map和unordered_set-CSDN博客
在C++11中,STL新增了4个unordered_xxx系列的关联式容器,它们在用法上和红黑树的关联式容器类似。但在查询效率上,unordered_xxx系列略胜一筹。红黑树中的节点非常多时,查询效率也不理想(需要进行多次比较),最坏情况下要比较高度次,unordered_xx系列容器进行很少的比较次数就能够将元素找到。 1. unordered_map unordered_map存储的是pair<key,value>的键值对。 unordered_map的key是唯一的,通过key可以找到对应的value。 unordered_map存储的元素是无序的。 unordered_map的迭代器是单向迭代器(前向迭代器)。 unordered_map支持[]访问,通过key返回value。 构造 容量 迭代器 只有正向迭代器,没有反向迭代器。 元素查找 (1)find (2)count (3)equal_range 插入和删除 哈希桶 []访问 2. unordered_set unordered_set的常见接口和unordered_map的接口一样,这里就不赘述。 3.
【C++模拟实现】哈希与unorder_set和unorder_map关联式容器的模拟实现_爱写代码的刚子的博客-CSDN博客
【C++模拟实现】哈希与unorder_set和unorder_map关联式容器的模拟实现 作者:爱写代码的刚子 时间:2023.10.4 前言:本篇博客主要介绍C++中的哈希以及两大重要的容器:unorder_set和unorder_map,以及模拟实现的注意事项 哈希概念 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经 过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( logN),搜索的效率取决 于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过 某种函数(hashFunc)****使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函 数可以很快找到该元素。 插入元素 根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放 搜索元素 对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功...
set和map的封装-CSDN博客
介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map #pragma once #include <iostream> #include <vector> #include <string> #include <queue> #include <cassert> #include <cstdlib> #include <utility> // 有迭代器的红黑树 namespace my_RB_Tree { enum colour { black, red }; template <class T> struct RBTreeNode // 结点 { RBTreeNode(const T& data) : _left(nullptr), _right(nullptr), _parent(nullptr), _col(red), _data(data) { } RBTreeNode* _left; RBTreeNode* _right; RBTreeNode* _parent; colour _col; T...
红黑树(有图解)_沐风ya的博客-CSDN博客
目录 介绍 概念 性质 插入 右旋 ++ -- 代码 介绍 红黑树是一种自平衡的二叉搜索树 它是在每个节点上引入额外的颜色信息,通过对任何一条从根到叶子的路径上各个结点着色方式的限制,确保没有一条路径会比其他路径长出俩倍,从而达到高度差的平衡 保证了在最坏情况下的时间复杂度为O(log n) 同时,它也是c++标准库中两种关联容器(set和map)的底层实现 结点颜色只有红色,黑色两种 根结点必须是黑色 每个叶子结点(也就是平常被我们忽略的空结点(NIL结点))都是黑色的 不能有两个连续的红色节点(从上到下的路径来看) 从任意一个节点到其每个叶子节点的路径必须包含相同数目的黑色节点,这被称为黑色高度(Black Height) 满足以上性质后,可以保证红黑树中,其最长路径中节点个数不会超过最短路径节点个数的两倍 模拟实现 和avl树一样,需要频繁用到父结点,所以需要一个parent成员 除此之外,他还需要存储每个结点的颜色信息 库中定义: stl库中,红黑树实际上还有一个哨兵位的头结点(当然没有也可以) 可以看到,树中定义了一个成员变量header...
<C++> 哈希表模拟实现STL_unordered_set/map
哈希表模板参数的控制 首先需要明确的是,unordered_set是K模型的容器,而unordered_map是KV模型的容器。 要想只用一份哈希表代码同时封装出K模型和KV模型的容器,我们必定要对哈希表的模板参数进行控制。 为了与原哈希表的模板参数进行区分,这里将哈希表的第二个模板参数的名字改为T。 template<class K, class T> class HashTable 如果上层使用的是unordered_set容器,那么传入哈希表的模板参数就是key和key。 template<class K> class unordered_set { public: private: HashTable<K, K> _ht; }; 但如果上层使用的是unordered_map容器,那么传入哈希表的模板参数就是key以及key和value构成的键值对。 template<class K, class V> class unordered_map { public: private: HashTable<K, pair<K, V>> _ht; };...
【C++】unordered_set与unordered_map的封装-CSDN博客
🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 🛸C++专栏:C++内功修炼基地 > 家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真重要,各位路 过的友友麻烦多多点赞关注。 欢迎你们的私信提问,感谢你们的转发! 关注我,关注我,关注我,你们将会看到更多的优质内容!! 一、unordered序列关联式容器 在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到logN,最差情况下也仅需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,unordered系列容器并不是有序的。 二、unordered_map与unordered_set结构 unordered_set并不像set那样支持反向迭代器,它的迭代器底层是一个单向迭代器。...
C++--哈希表的实现及unorder_set和unorder_map的封装_函数指针的博客-CSDN博客
1.什么是哈希表 哈希表是一种数据结构,用来存放数据的,哈希表存放的数据是无序的,可以实现增删查,当时不能修改数据。可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。该方式即为哈希(散列)方法,哈希方法中使用的转换函数称为哈希(散列)函数,构造出来的结构称为哈希表(Hash Table)(或者称散列表)。 unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。 在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。...
【C++】unordered_map与unorder_set的封装(哈希桶)_Satoru_Kaugo的博客-CSDN博客
前言 我们开辟一个指针数组,指针数组中存放我们结点的类型,我们算出元素的下标hashi后,头插在数组的对应位置,数组的位置可以链接一串链表,所以也避免了哈希冲突 一、模板参数的改造 我们这里把pair<K,V>看成一个整体,我们设计模板的时候就不需要考虑是不是键值对类型,需不需要多传一个模板参数的问题,达到了普适性。 template<class T> struct HashNode { T _data; HashNode<T>* _next; HashNode(const T& data) :_data(data), _next(nullptr) {} }; 在map中,T传pair<K,V>类型 在set中,T传K类型 二、模板的特例化操作 我们要想插入一个结点,肯定要知道这个结点插入的位置,所以我们要自己写一个哈希函数的模板来进行下标的计算,但我们int类型之间计算下标很容易,那我们字符串该怎么办? 这个时候就需要模板的特例化了,根据传入的参数不同,具体类型具体分析 template<class K> struct DefaultHashFunc { size_t...
利用哈希表封装unordered_map和unordered_set_高比拜仁0824的博客-CSDN博客
1.1 普通迭代器 对于哈希桶结构,它的迭代器应该如何设计呢?我们仅封装一个Node的指针就行了吗?其实这里是仅用一个指针是不够的,因为在迭代器重载operator++的时候,如果当前位置的链表还没有遍历完,那就是直接_node=_node->_next就行了,但是如果哈希表中当前位置的链表已经遍历完了,那么就要计算当前迭代器是在哈希表中的哪一个位置,然后从哈希表的下一个位置开始遍历找出下一个不为空的_node,这个_node构造的迭代器就是iterator++的结果,所以现在的问题是我们要知道当前迭代器在哪一个桶,就要知道这个哈希表的size,然后用_node->_data的key%size得到的余数才是当前的位置,但是_node节点中并没有size呀,所以我们选择把哈希表的指针传过来,有这个表的指针就什么数据都有啦! 所以迭代器应该有一个Node和一个HashTable*构成。 代码实现: Self& operator++() { KeyOfT kot; HashFunc hf; Node* cur = _node; if (_node && _node->_next) {...
C++哈希(散列)与unordered关联式容器封装(Map、Set)_RXY24601的博客-CSDN博客
在C++98中,STL提供了以红黑树为底层数据结构的关联式容器(map、set等),查询时的效率可以达到,最差情况下需要比较红黑树的高度次。因此在C++11中,STL提供了四个unordered系列关联式容器,与红黑树的结构类似,但是底层结构不同。其中unordered意为无序 1.unordered_map 在unordered_map中,键值通常用于唯一标识元素,而映射值是具有与此键关联的内容的对象。键和映射值的类型可能不同。内部不会对键值或映射值进行排序,而是根据哈希值存储在桶内,并且按照键值直接快速访问单个元素(平均时间复杂度恒定) unordered_maps实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问 value.
【C++】unordered_set 和 unordered_map 使用 | 封装
unordered_map官方文档 unordered_set 官方文档 set / map与unordered_set / unordered_map 使用功能基本相同,但是两者的底层结构不同 set/map底层是红黑树 unordered_map/unordered_set 底层是 哈希表 红黑树是一种搜索二叉树,搜索二叉树又称为排序二叉树,所以迭代器遍历是有序的 而哈希表对应的迭代器遍历是无序的 在map中存在rbegin以及rend的反向迭代器 在unordered_map中不存在rbegin以及rend的反向迭代器 1. unordered_set的使用 大部分功能与set基本相同,要注意的是使用unordered_set是无序的 插入数据,并使用迭代器打印,会按照插入的顺序输出,但若插入的数据已经存在,则会插入失败 2.
Show More
loading
Actions
Is this you?
As a journalist, you can create a free Muck Rack account to customize your profile, list your contact preferences, and upload a portfolio of your best work.Get in touch with class
Contact class, search articles and posts on X, monitor coverage, and track replies from one place.
Learn more about Muck Rack