![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
侯捷老师STL
文章平均质量分 55
用心记录侯老师课程的重点内容,方便学习
努力的小带土
这个作者很懒,什么都没留下…
展开
-
map的下标操作符
操作符的实现: 乍一看,return后面很复杂,现在我们将它一步步拆解,首先根据键值和实值创建一个元素,value_type(k,T()),再将该元素插入map中insert(value_type(k, T()))此时需要注意,map的取下标符号主要有两个功能即分别是左值和右值,如下代码所示: 作为左值的情况,便是想为map增添新元素,当输入的key与原有map中的key不相等的情况下便插入,此时insert(value_type(k, T()))的返回值为pair...原创 2022-06-15 17:31:36 · 1272 阅读 · 1 评论 -
课外扩展-红黑树的删除操作
讲解红黑树的删除操作原创 2022-06-15 10:38:48 · 378 阅读 · 0 评论 -
RBtree
红黑树课程的笔记原创 2022-06-13 09:32:35 · 377 阅读 · 2 评论 -
(课外扩展)红黑树左右旋
左旋:以某个节点作为旋转点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变。 右旋:以某个节点作为旋转点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变。 如上图便是左旋的过程,将pr拉上去之后p下去。P做为pr的左节点之后断开rl(因为二叉树),因为rl也需要连接父节点,故最终rl做为p的右子节点。 通过代码来理解左右旋的过程: /** * 围绕p左旋 * pf原创 2022-05-27 17:30:37 · 177 阅读 · 0 评论 -
(课外扩展)2-3-4树和红黑树的关系
二叉树: 查找前驱节点:小于当前节点的最大值。 查找后继节点:大于当前节点的最小值。(注:中序排序才有前驱节点和后继节点) 二叉树的删除: 叶子节点直接删除,因为没有子节点。 只有一个子节点的用子节点替代(本质上就是找前驱节点和后继节点,左节点为前驱节点,右节点为后继节点)。 有两个子节点的需找到替代节点(替代节点就是前驱节点或者后继节点,两个节点都可以)。 如下图所示:如果我们要删除2节点,2节点的前驱节点为1.5后继节点为2.5,因此这两个节点均可以替代2节点。 替代之后二叉树...原创 2022-05-26 21:31:44 · 162 阅读 · 0 评论 -
7、deque容器及stack和queue容器
容器deque是一个(分段)连续空间,在表现上是连续,实际上是分段。deque的迭代器分别有四个指针,cur,first,last,node,node指针指向控制中心,即map(map的组成原理是vector数组)。当cur达到了first或last的时候(first和last表示这段空间的首尾),通过map中的指针来指向下一段缓存区。start iterator是为了指明开始的一段缓存区 ,finish指向结束缓存区。接下来看一下deque源码(注意BufSiz): 现列出deque的一个经...原创 2022-05-19 10:42:14 · 234 阅读 · 0 评论 -
6、vector深度探析
vector数据安排与操作和array相似。两者的区别在于array是静态空间一但确定大小就不能改变,要换大小只能有程序员去声明新的array空间,将旧空间的变量挨个赋值过去。而vector是动态空间,随着放入的元素增多,它的内部机制会自行扩充空间来容纳元素。 首先来看看vector的源码 ...原创 2022-05-07 21:31:14 · 551 阅读 · 0 评论 -
5、迭代器设计原则和Iterator traits的作用与设计
迭代器的设计原则 在上一节4、list深度探索_努力的小带土的博客-CSDN博客讲解list的时候,观察仔细的小伙伴一定注意到了,下面代码中五个typedef是迭代器中必不可少的组成部分。 template<class T, class Ref, class Ptr> struct __list_iterator{ //所有的迭代器都要有这5个typedef typedef bidirectional_iterator_tag iterator_category;//(1) type原创 2022-05-02 20:58:37 · 470 阅读 · 0 评论 -
4、list深度探索
list的数据结构 list不仅是一个双向链表,而且是一个环状的双向链表,因此它只需要一个指针,便可以完整的表现整个链表: template <class T, class Alloc = alloc> class list{ protected: typedef __list_node<T> list_node; public: typedef list_node* link_type; typedef __list_iterator<T, T&, T原创 2022-05-02 15:33:15 · 912 阅读 · 0 评论 -
3、关联容器测试(multiset,multimap,set,map,unordered_multiset.......)
衔接上章https://blog.csdn.net/qq_42138448/article/details/124259469,本章主要内容还是讲解容器。关联容器主要优势是查找,但我们安插的时候,是按照顺序来安插,因此会稍微慢一点。 multiset测试代码: #include <set> #include <iostream> #include <cstdlib> #include <ctime> namespace stl03 { void原创 2022-04-23 11:47:40 · 811 阅读 · 0 评论 -
2、容器的结构与分类,array容器的测试,vecotr容器的测试,以及其他顺序容器的一些细节
容器的结构与分类: 首先介绍一下顺序容器: Array 是数组,确定了开始位置和结束位置,同时不能超出它的内存。 Vector 确定了开始位置,但可以一直向后添加新的空间去存放元素。 Deque 开始位置能够扩充并且结束位置也能够扩充 List 双向链表,相比于Forward-List占用的内存更大,因为一个元素对应两个指针。 Forward-List 单向列表,看下面的小图可知开始位置是确定的。 关联容器:(一般用于查找) Set 中key和value是一样的,通过红黑树来编写。 M原创 2022-04-18 21:06:29 · 962 阅读 · 0 评论 -
1、 STL的六大部件、c++11 遍历for循环以及auto
六大部件:分配器,容器,仿函数,算法,迭代器,适配器。它们之间互相有关系,容器是通过分配器来分配内存的。 下例代码演示了六大部件如何操作: 容器中值得注意的是: 所有容器都是前闭后开区间,即c.begin()指向第一个元素,而c.end()指向的是最后一个元素中的下一个位置。因此若想要通过常规for循环遍历容器则方法为for(;ite != c.end();ite++)。 现c++11给出一个更好的遍历方式,同时为了避免申明像Container<T>::iterator这样较为复原创 2022-04-17 16:18:05 · 1007 阅读 · 0 评论