unordered_set原理 1. 基本概念 unordered_set 是C++ 标准模板库(STL)中的一个关联容器,用于存储唯一元素。与 set 不同,unordered_set 中的元素没有特定的顺序,并且不保证元素按任何特定顺序排列。unordered_set 允许快速查找、插入和删除操作,因为它使用哈希表来实现这些功能。
在之前使用红黑树封装map&set的时候已经说明,我们对于map&set的迭代器的处理,使用的是红黑树实现的迭代器。所以这里同样的,使用的是哈希桶封装的迭代器,那么我们首先就改写哈希桶 1.2.1 迭代器类的实现 和红黑树的迭代器一样,原生指针不能支持迭代器行为,所以我们需要自己手动实现一个迭代器类,然后进行一些运算符...
unordered_set的底层实现是哈希表,因此插入、删除和查找的时间复杂度平均为O(1)。 unordered_set的插入操作非常简单,只需调用insert()函数即可。删除操作可以使用erase()函数,该函数可以接受一个迭代器参数,也可以接受一个值参数,删除所有等于该值的元素。查找操作可以使用find()函数,该函数返回一个迭代器,指向第一...
set1.find(2);//查找2,找到返回迭代器,失败返回end()set1.count(2);//返回指2出现的次数,0或1set1.emplace(3);//使用转换移动构造函数,返回pair<unordered_set<int>::iterator, bool>set1.insert(3);//插入元素,返回pair<unordered_set<int>::iterator, bool>set1.insert({1,2,3});//使用initial...
哈希桶的实现原理 首先,思路是用 vector 来作为基础容器,里面存储的数据类型是一个结构器结点类型,结点中存储模板类型的数据和 _next 指针。当要插入数据的时候,先根据这个数据利用除留余数法计算出它的 hashi,然后再头插到对应 vector 的位置。 一般设置哈希桶的负载因子为1,当哈希桶的负载因子恰好等于 1 的时候...
前面我们利用红黑树封装了map(set),其存储的数据一般是有序的,今天我们封装unordered容器,实现无序的unordered_map(set)。 2、原理: 利用哈希表中的哈希桶实现其底层 3、步骤: (1)进一步封装已完成的HashTable,实现KeyOfT来区别map(pair<K,V>)和set(K)传入的数据类型; (2)实现迭代器iterator (3) 实现无法...
unordered_set, unordered_multiset, unordered_map, unordered_multimap的底层实现皆为_Hashtable,定义于bits/hashtable.h。 以unordered_set 为例,它内含了一个指定了模板参数的_Hashtable。 //unordered_set.h37/// Base types for unordered_set.38template<bool_Cache>39using__uset_traits=__detail::_Hash...
最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map进行介绍,unordered_set、unordered_multimap和unordered_multiset可查看文档介绍。
unordered_map和unordered_set的主要区别在于它们存储的元素类型:map存储键值对(key-value pairs),而set仅存储唯一的键值(通常是键本身作为值)。尽管如此,它们在底层数据结构(如HashTable)的实现上有很多相似之处 改造内容如下: K:key的类型 T:如果是unordered_map,则为pair<K, V>; 如果是unordered_set,则为K...
map / set ,底层实现是红黑树 + 自带排序的性质 + 查找的时间复杂度是O(logn) - 每个节点都需要存储额外的信息 unordered_map / unordered_set,底层是哈希表 + 哈希表通过Key计算查找非常快 理想情况下是O(1) - 篮子数量>元素数量,每次扩充复制的时候比较耗时 1. hashtable 2. unordered_set / multi ...