![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 70
本专栏用以记录我学习C++的知识
meeiuliuus
真理无穷,进一步有进一步的欢喜
展开
-
C++实现单例模式/工厂模式
单例模式即一个类只创建一个实例,提供一个全局访问点。单例模式主要是为了控制资源访问,在一些功能如:数据库连接池,日志类实例,线程池等都可以采用单例模式。原创 2024-08-08 13:12:13 · 406 阅读 · 0 评论 -
【C++】深入再学习const
NOTE]昨天下班和实习生同事一起去吃饭,回出租屋就睡了,结果2点醒了到现在睡不着,就起来把这篇文章写了。刚写完,又困了,先睡了,早上起来再发表吧2024年4月12日04点54分。原创 2024-04-12 20:03:31 · 636 阅读 · 0 评论 -
【C++】STL源码阅读+模拟实现全流程记录
NOTE]转眼间4月已经一周过去了,回想起本系列的第一个博客 vector的使用和源码解析 已经是3月中旬的文章,不得不感慨时间飞逝。尤其是在这个阶段,2024年秋天,我将踏上残酷的秋招战场,与全国各大顶尖高效的学生甚至一些海外的留学生一起竞争那不知所剩有几的校招岗位,我不禁也开始感到紧张和焦虑。但这种情况下,为什么我还要花这将近20天的时间去看STL的源码呢?去花费大量的时间去模拟实现?我有时也会这样问自己是否值得?原创 2024-04-08 19:48:10 · 796 阅读 · 1 评论 -
【C++】set map模拟实现
map和set底层都是使用的红黑树,但是上层的接口有一些不同。像map的话是靠key获得value,而set因为key和value是相同的,所以涉及到value的操作全都等同于key,比如find。所以需要对红黑树加一层封装。原创 2024-04-07 22:13:20 · 306 阅读 · 0 评论 -
【C++】set map的使用和源码解析
NOTE] 先看前文set map底层采用的是红黑树作为底层数据结构,因此插入删除查询的时间复杂度都为O(logN),其中红黑树又是一种平衡二叉搜索树,因此要想看得懂本章,需要先了解一下二叉搜索树,AVLTree和红黑树。原创 2024-04-06 23:20:41 · 806 阅读 · 0 评论 -
【C++】红黑树学习 + 实现
_kv(kv),_col(RED){}可以看到,相比于AVL树,红黑树节点的定义唯一的变化是平衡因子变成了表达红色黑色性质的两个节点RED,BLACK,且默认节点为红色。原创 2024-04-06 18:18:56 · 888 阅读 · 0 评论 -
【C++】AVL树学习 + 模拟实现
平衡二叉树-Bilibili视频所谓AVL树是在二叉树基础上改进而来的树,本质上是一颗二叉搜索树,但比二叉搜索树多了一个特性——平衡性[[【C++】 二叉搜索树复习+模拟实现]|二叉搜索树]] 有个很大问题是,如果插入的元素单调递增,那么二叉搜索树就会退化成链表,查询的时间复杂度就会退化成O(N),为了解决这个问题,我们给每个二叉搜索树添加平衡因子,根据平衡因子对不平衡的树进行处理,使其满足二叉搜索树性质的同时,成为一颗平衡的树。INFO] 什么是平衡。原创 2024-04-05 18:23:14 · 812 阅读 · 0 评论 -
【C++】 二叉搜索树复习+模拟实现
Note] 最近把笔记软件改成了obsidian了,也是一个朋友给我推荐的。语雀其实挺好用的,但是感觉obsidian的上限更高,并且在看了卡片盒笔记法后,我觉得知识是要成网络的。而语雀没有这样的能力,obsidian的网络节点功能能更好地帮我梳理知识点之间的关系。好的工具是大脑的延申嘛人总是要不断地踏出舒适圈,才能得到最快地提升,包括后面我可能去练习一下vim的操作,不过那是后话了~今天我们来看一下二叉搜索树,作为学习map/set的前置知识。原创 2024-04-04 18:26:05 · 579 阅读 · 0 评论 -
【C++】stack/queue模拟实现
上一章【C++】stack/queue/priority_queue使用和源码解析-CSDN博客看了源码,今天来模拟实现一下;原创 2024-03-30 16:14:41 · 212 阅读 · 0 评论 -
【C++】stack/queue/priority_queue使用和源码解析
今天晚上七点本来有携程的笔试,结果我忘记了,晚上回来之后就洗澡洗袜子之类的搞到7点40,我看下一场的时间是4月16日,估计到那个时候携程也没什么hc了吧。算了,长个教训吧,以后要善用手机的日历,闹钟功能。不说这些,今天来看stack/queue的源码~在前面几篇博客中,我们用的vector,list,deque都是底层容器。而今天的stack/queue是容器适配器,区别是:容器适配器是实际上是在底层容器的基础上提供特定的接口的封装。比如栈stack是双端队列实现的,只能后进先出。原创 2024-03-28 21:33:05 · 710 阅读 · 2 评论 -
【C++】deque的使用和源码解析
这周开始实习了,白天的时间都要花在实习上,所以自己学习的时间就变少了很多。目前我还没有想到很好的平衡实习与自己学习的办法,原本计划的在四月份之前看完STL的主要容器和容器适配器的任务也不知道能不能完成,3月29号是周五,还有一个周末,目前今晚不管睡多晚,我都一定把deque看完。看明天后天两天能不能把stack/queue给看了,这个周末就隔离一切干扰,把AVLTree和RBTree给搞懂,可以的话自己写一写map和set,四月份再制定新计划了~——2024年3月27日。原创 2024-03-27 22:47:31 · 657 阅读 · 0 评论 -
【C++】my list模拟实现
感觉STL 的list中很多成员函数就是Leetcode上关于链表的一些题,而哨兵节点的思想对于一些需要双向链表的题也很好用,比如LRU算法;anyway,看源码还是能学到很多东西的;原创 2024-03-19 20:59:10 · 304 阅读 · 0 评论 -
【C++】list的使用和源码解析
感觉得加快进度了,就不一个一个自己写list的使用了;直接将常用的从官方文档复制下来,等后面自己实现的时候直接写吧。原创 2024-03-19 17:23:20 · 321 阅读 · 0 评论 -
【C++】my vector模拟实现
今天来模拟一下vector的基础功能,尤其是我们刷算法题常用的那些;比如什么size() begin() end() []操作符等等,实现的时候,我会先将函数的名字声明写上,先不写定义;然后再关掉所有资料和源码,纯靠自己的理解来实现一遍,这样对个人的提升应该是最大的。否则的话看着vector源码写也失去了意义,毕竟vector的内容并不复杂;最复杂的部分也不过涉及push_back的扩容机制。话不多说,开始写~原创 2024-03-18 19:35:37 · 773 阅读 · 2 评论 -
【C++】Vector的使用和源码解析
其实很早之前,我就有去看STL源码的想法了。只是一直没有一个好的机会。最久空闲时间比较多,也正是这样一个好机会去阅读源码。为了事半功倍,不走弯路,我在网上查了很多资料。目前来说,C++ STL的源码相关的中文书籍还停留在侯捷老师的2002年出版的STL源码剖析。虽然侯捷老师确实是非常厉害的,很有教学能力的一位C++老师,但是还是要提,在计算机技术日新月异的环境下,一本二十多年前的书籍确实已经有点落后了。原创 2024-03-17 22:53:59 · 1180 阅读 · 1 评论 -
C++ 关键字 const
另外,const是函数签名的一部分,也就是说可以因为const实现成员函数重载,调用的时候普通对象可以调用const版本的函数,但是如果有非const版本的重载,那么会选择非const。:既指针指向的对象不可以修改(注意,这里的不可以修改是不可以通过const修饰的int修改,但如果指向的对象有其他变量名的话,是可以通过其他变量名修改的):即指针指向的方向不可以修改,但是指向的内容是可以修改的,同时也意味着不能接收一个const类型的对象。const 在 * 的右边,常量指针:int* const a;原创 2024-03-15 13:50:05 · 337 阅读 · 0 评论 -
【C++】实现三个线程顺序打印1 2 3
在线程之间同步的时候,往往要使用锁和信号量机制来完成对资源的绑定。恰巧我在牛客上看到过一个面试题,题目:创建3个线程,三个线程按顺序分别循环打印 1 2 3这个题是个生产者消费者模型的变体,每个线程既是生成也是消费者。原创 2024-03-12 10:46:40 · 544 阅读 · 0 评论 -
【C++】模板参数可变化varidic templates
模板实例化不是发生在预处理时期,而是发生在编译阶段的实例化时期,例如代码中创建对象或者调用函数时,编译器会传递给模板的具体类型生成实际的代码,这是懒惰的过程,只在需要的时候进行实例化,减少编译后可执行文件的大小。在递归展开的过程中,模板参数包中的每个参数都被单独处理,直到展开完所有参数。中第二个模板参数在typename后加...是是语法设计的一种,表示该参数可能有很多。编译器在编译时对模板进行了实例化,即将具体的数据类型替换模板设定的typename。拆成新的Arg + args,循环往复,直到。原创 2024-03-04 21:25:59 · 383 阅读 · 0 评论 -
【C++】类的转换函数
由编译器进行隐式转换。编译器会先找 int + Fraction的全局 + 的定义,或者去Fraction内部寻找是否存在转换函数。如下实例,设计一个分数类,实现分数转换成double 浮点数的转换函数。并在mian函数隐式调用。C++中当你创建了一个类,你想把这个类对象转换成基本类型的函数。类对象->基本类型对象。基本数据类型->类类型。类类型->另一类类型。原创 2024-03-02 18:01:22 · 331 阅读 · 0 评论 -
【C++】类与类之间的关系----复合
学习完侯捷老师的面向对象程序设计后的复合篇章后,我对类与类之间的关系产生了兴趣,所以我让chatGPT帮我设计了一个用了这些关系的案列,由我来写代码并验证。今天这章来写复合案例,所谓复合,就是在一个类中包含另一个类成员。与复合有关的知识点主要是类和包含类的构造和析构关系,下面我用代码来验证。原创 2024-02-29 09:27:23 · 464 阅读 · 0 评论 -
【C++】拷贝构造函数(深拷贝和浅拷贝)
而且,当实例c1的生命结束时,我们释放指针,而另一个实例c2没有释放,这时去使用它会导致不可预期的错误。同时,当程序离开两个myString所在的作用域,程序会按顺序调用两次析构函数,后执行的析构将释放一个不存在的内存空间,这也是一个未定义的行为。可以看到调用一次析构,析构的是this=0x7fffffffe368内存实例,而当函数出来时,两个实例的m_data指向的内存内容都没有了。改完之后的我就不进行GDB调试了,总之,当这样更改完之后,我们的拷贝构造就变成了深拷贝,避免了双重析构的问题。原创 2024-02-26 18:03:45 · 418 阅读 · 0 评论