![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
STL
q435201823
11
展开
-
STL浅谈 hash_multiset/hash_multimap
hash_multiset/hash_multimap与hash_set/hash_map特性一致,区别在于multiset/multimap的键值能够重复。也就是说,他们使用了hashtable的insert_equal而非insert_unique。hash_multiset和hash_set的区别... template <class InputIterator> h...原创 2019-11-13 15:31:12 · 153 阅读 · 0 评论 -
STL浅谈 hash_set/hash_map
hash_set和hash_map不属于STL标准,所以一般情况下无法使用,不过C++11中有对应的容器unordered_set和unordered_map。hash_sethash_set底层机制由hashtable提供,和set一样能够快速搜索元素,但是set元素插入后会自动排序,而hash_set是无序的。template <class Value, class HashFcn...原创 2019-11-13 15:28:44 · 123 阅读 · 0 评论 -
STL浅谈 hashtable
hashtablehashtable实现的是哈希表这个数据结构。可以将值hash操作后映射到表中的一个位置进行存储。hashtable对数据的访问是O(1)的,但是会占比较多的空间。对与稀疏数据是不利的。碰撞散列函数会有一个无法避免的问题,可能会有不同的元素被映射到了相同的位置,这就是碰撞问题。下面将介绍碰撞问题的几种解决方法。负载系数首先我们认识一个名词:负载系数,指的是元素个数除...原创 2019-11-13 15:26:44 · 390 阅读 · 0 评论 -
STL浅谈 multiset/multimap
multiset/multimap与set/map特性一致,区别在于multiset/multimap的键值能够重复。也就是说,他们使用了rb-tree的insert_equal而非insert_unique。multiset和set的区别:... template <class InputIterator> multiset(InputIterator first, In...原创 2019-11-12 15:51:24 · 131 阅读 · 0 评论 -
STL浅谈 map
map存储键值对。map容器的特性是所有元素都会根据键值自动排序,并且所有元素都是pair,拥有键值和实值。pair的第一个元素为键值,第二个元素为实值。map当中不允许存在两个键值相同的元素。map的底层为RB-tree。<stl_pair.h>中的pair定义template <class T1, class T2>struct pair { typede...原创 2019-11-12 15:48:24 · 84 阅读 · 0 评论 -
STL浅谈 set
set可以理解为数学中的集合,不存在重复值。set特性1.set不存在重复值。2.set会根据元素大小排序3.无法通过迭代器改变元素值。(为了维护元素排序规则)。4.底层为RB-treeset定义// 默认使用递增排序template <class Key, class Compare = less<Key>, class Alloc = alloc>cl...原创 2019-11-12 15:36:07 · 83 阅读 · 0 评论 -
STL浅析 RB-tree(红黑树)
RB-tree(红黑树)是平衡二叉搜索树。RB-tree满足二叉搜索树的规则之外,还遵循以下特性:每个节点不是红色就是黑色。根节点为黑色。如果节点为红色,其子节点必须为黑色。任意一个节点到到NULL(树尾端)的任何路径,所含之黑色节点数必须相同。红黑树原理因为红黑树比较复杂,特别是旋转和变色很难描述,篇幅也会很长,所以这里推荐一下这个视频:红黑树原理及平衡二叉树旋转详解RB-t...原创 2019-11-12 15:15:58 · 561 阅读 · 0 评论 -
STL浅析 树
树树由节点(nodes)和边(edges)构成。整棵树有一个最上端节点,称为根节点(root)。每个节点可以拥有具有方向性的边(directed edges),用来和其他节点相连。相连节点之中,在上者称为父节点(parent),在下者称为子节点(child)。无子节点者称为叶节点(leaf)。子节点可以存在多个,如果最多只允许两个子节点,即所谓二叉树(binary tree)。不同的节点如果拥有...原创 2019-11-09 15:27:04 · 924 阅读 · 0 评论 -
STL浅析 heap、priority_queue
heapheap(堆),并不属于STL容器组件,作为priority_queue(优先队列)的底层容器。priority_queue的特点就是推入多个元素,当取出时,取出的是priority_queue里面优先级最高的那个元素,元素的优先级可以自定义也可以默认按照大小顺序。binary max heap 正是具有这样的特性,适合做为 priority queue 的底层机制。堆和二叉搜索树...原创 2019-11-08 15:41:30 · 687 阅读 · 0 评论 -
STL浅析 stack、queue
stack是一种先进后出的数据结构,它只有一个出口,只能够在顶端新增、移除、取得元素,没有其他方式进行操作。stack不支持随机访问。stack的基础容器stack默认是以deque作为基础容器来实现的。使用vector作为基础容器在拓展容量时需要[开辟新内存,复制元素,释放就内存]有较高的时间复杂度,不适合stack。而deque的扩容动作比vector小的多,只需要[开辟新内存]就足够了...原创 2019-11-08 14:01:30 · 127 阅读 · 0 评论 -
STL浅析 deque
vector是单向开口的连续线性空间,deque是双向开口的连续线性空间。所谓双向开口,就是可以在头尾两端做插入和删除。虽然vector在头部做插入和删除也可以实现,但效率很差,因为会不断的移动整个数组。而deque在头部的插入和删除是O(1)的时间复杂度。deque和vector的差异1.deque允许在O(1)时间复杂度内对头部进行插入和删除。2.deque没有容量的概念,因为它是...原创 2019-11-07 16:04:24 · 249 阅读 · 0 评论 -
STL浅析 list
list是一个双向链表,适合插入删除频繁的操作。list的节点next指向链表节点的下一个节点,prev指向前一个节点。data存储节点数据。template <class T>struct __list_node{ typedef void* void_pointer; void_pointer next; // 前后指针都是v...原创 2019-11-06 16:38:56 · 105 阅读 · 0 评论 -
STL浅析 vector
vector 的数据安排以及操作方式,与 array 非常像似。两者的唯一差别在于空间的运用弹性。array 是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切细琐得由客端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,然后再把原来的空间释还给系统。vector 是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector的迭代器templa...原创 2019-11-06 12:16:51 · 120 阅读 · 0 评论