自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 收藏
  • 关注

原创 零基础入门C++项目

近段时间在复习C++,摸索了一条比较高效的学习路线.博主也画了几张思维导图,每个子主题都有博客和代码链接,可以说是十分清晰明了.由于博主还有些边角料没学完,后续还会陆续更新,一起来学西plusplus吧!

2022-10-04 15:30:20 610 3

原创 虚基类虚基表虚函数表之间的关系

我们通过内存发现B的对象模型中在虚基表的偏移量前面多存了一个指针,这个指针存的是距离自己建立的虚表的指针的偏移量。但是B、C都重写func函数,B、C是共享一个A,那你说子类D是放B的虚函数还是C的虚函数呢?因为它们现在就和多继承一样,各自有各自的虚表,子类对象D有一个B,有一个C,B有一个虚表,C有一个虚表,各自玩各自的,反正A有两份,无所谓。还有一个问题,如果我在B/C中增加一个虚函数func1,B继承了A,C继承了A,现在只有同一份A,那B、C的虚函数都往A的虚表里面放吗?

2022-10-04 14:56:27 599

原创 哈希表的封装

迭代器设计:不用考虑往回走,单向迭代器。

2022-09-12 09:50:29 342 2

原创 模拟实现哈希

开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。因为新表插入得重新newnode节点,重新计算每一个节点的映射位置,还得释放旧表的节点,这是不好的。我们没有必要去创建新的节点,可以直接把旧表的节点拿过来,但是不能像以前一样去调用insert(势必会开新节点)。对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置。

2022-09-12 09:49:45 329

原创 哈希的使用

/ 遍历s1,如果s1中某个元素在s2中出现过,即为交集。因为rand的随机数有数量限制,超过后会一直重复。

2022-09-12 09:48:56 430

原创 C++模板进阶

/ 静态栈{private:T _a[N];int _top;};}非类型模板参数不能修改,浮点数、类对象以及字符串不允许作为非类型模板参数。

2022-09-05 08:43:13 202 1

原创 【STL】stack和queue

这样设计也可以间接支持随机访问,比如我要访问第23个数据,我只需要23/10,就知道它在第几个buf,再用23%10就知道它在buf的第几个位置。它也有push、top和pop接口,但是它的top、pop分别是取或者删除优先级最高的数据,大的优先级高还是小的优先级高是可以控制的,具体看实际应用场景。其实它的底层是堆,可以在任意时刻插入数据,默认是大堆,当然也可以通过仿函数去调整。第一个buf满了,继续尾插就用数组中间指针的下一个指针指向新buf,头插就用数组中间指针的前一个指针去指向新buf。...

2022-08-29 22:13:05 468

原创 程序地址空间

我们已经说进程具有独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰!无非就是进程相关的数据结构是独立的,进程的代码和数据是独立的。假设身价10亿的富翁有3个私生子,为了不让3个儿子因为家产产生纠纷,富翁就骗每个儿子都是自己的独子,且为了维护3人之间的独立性,给每个儿子都制定了目标,只要达到目标就能继承10亿家产。那么这里的富翁就是操作系统,三个私生子就是进程,富翁给三个私生子画的大饼就是虚拟进程地址空间。...

2022-08-29 22:08:54 827

原创 Linux进程控制

所以最终采用写时拷贝:只会拷贝父子修改的,变相的,就是拷贝数据的最小成本,但是拷贝的成本依旧存在。废弃的内核结构的数据已经被释放了,但是内核结构开辟的空间还在,当你再次创建进程时,会把相应的task_struct和mm_struct重新初始化,就节省了重新开辟空间的消耗!父进程创建子进程之后,父子都有虚拟地址空间和页表,只不过子进程的各种隐射关系全部继承自父进程,所以父子的代码是共享的!通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。...

2022-08-29 22:07:27 476

原创 lLinux环境变量

但是,还有一部分命令,不通过子进程的方式执行,而是由bash自己执行(调用自己的对应的函数来完成特定的功能),我们把这种命令叫做。BASH也是通过fork去创建子进程,至于是怎么样把我们写的代码加载进子进程的,怎样传入命令行参数的?Linux系统中会根据不同的选项让不同的命令可以有不同的表现!当进程在被执行的过程中,一定会存在大量的临时数据,会暂时存在CPU的寄存器中!同一个程序,通过传递不同的参数,让同一个程序有不同的执行逻辑和执行结果!argc记录的是命令行参数的个数,argv接收的是程序名和选项!..

2022-08-29 22:00:59 252

原创 Linux进程实操

到选中队列的第一个进程,开始运行,调度完成!(4). 遍历queue[140]时间复杂度是常数!但还是太低效了。

2022-08-29 21:58:58 751

原创 Linux进程概念

类比银行系统,银行是不相信任何人的!银行给所有人提供服务的方式是通过窗口提供的。而内核是用C语言写的!接口:用C语言给我们提供的函数调用!操作系统也是不相信任何人,要防止少数人,又要给多数人提供服务。操作系统是通过给用户提供接口的方式来进行服务的!...

2022-08-29 21:57:30 442

原创 Linux开发工具

change是属性被修改的时间,modify是内容被修改的时间。首先我建一个multi_make的目录来演示,分别创建test.h、test.c、main.c的文件。.gitignore相当于黑名单,可以在这个黑名单文件内编辑自己不想上传的文件,通过添加文件后缀。头文件:给我们提供了可以使用的方法,所有的开发环境具有语法提示,本质是通过头文件帮我们搜索的!库文件:给我们提供了可以使用的方法的实现,以供链接,形成我们自己的可执行程序!vim是一个编辑器,只能用来写代码,但是它功能强大,是一个多模式的编辑器。.

2022-08-29 21:56:18 1622

原创 Linux权限学习

有时候我们需要一个目录,这个目录可以让所有人删除或创建临时文件,我们Linux系统当中就有这样的目录:tmp。tmp的拥有者和所属组是root,其他人允许以other身份在该目录下进行文件的创建,读取,删除,修改等。在一个共享目录下,你的文件不让我写,不让我读,但防不住我删除!如果我还想在共享目录下,形成临时文件。但是,不允许除了我之外的人删除!方法是给共享的加上粘滞位!假设有一个共享目录allchmod +t all //加上粘滞位后别人无法删除tmp目录默认带有粘滞位。...

2022-08-29 21:54:38 954

原创 【STL】list

const对象调用的是const的begin,const的begin返回的是const迭代器,const迭代器是参数加const的迭代器类typedef来的,const T&和const T*传给迭代器类模板,分别应用到了Ref和Ptr的位置。普通对象调用的是普通的begin,普通的begin返回的是普通迭代器,普通迭代器是参数没加const的迭代器类typedef来的,T&和T*传给迭代器类模板,分别应用到了Ref和Ptr的位置。节点的指针解引用还是节点,节点的指针++能到下一个节点吗?...

2022-08-29 21:52:54 327

原创 C++多态

同名成员变量也是隐藏关系。

2022-08-29 21:48:35 256

原创 Linux基本认识及指令

OS是一款用来对软硬件资源进行管理的软件。管理目的:对上,对下,提高操作效率。

2022-08-18 12:17:04 250

原创 二叉搜索树

InsertR转换成最小规模子问题,如果插入值比当前节点的值大,那么就去你右子树里插入,如果插入值比当前节点的值小,那么就去你的左子树里插入。就让父亲的左指向cur的右。EraseR转换成最小规模子问题,如果删除值比当前节点的值大,那么就去你右子树里删除,如果删除值比当前节点的值小,那么就去你的左子树里删除。cur左右孩子都不为空就用替换法,我们这里找右子树的最小节点(以cur为根),因为交换后就变成删除右子树的最小节点,此时该节点左孩子一定为空(因为是最小节点),继续用托孤的方法删除该节点。...

2022-08-18 12:14:10 301 1

原创 二叉搜索树的应用

首先,我们的目的是查找Key的时候随便查找Value,所以节点的结构、Insert和new的时候都要增加第二个参数Value。递归时,我们很容易知道当前节点的前一个节点是什么,但是无法知道下一个节点是什么,所以我们不能改变当前节点的右指针(后继指针)。再比如检查一篇文章单词释放拼写错误:以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树,在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。考虑用栈来存储p、q的路径,让路径长的先走,路径相等后同时走,转换成求两个路径的交点。...

2022-08-18 12:10:58 1255

原创 set和map的使用

insert单元素版本(1)返回一个元素对pair,pair::first被设置为一个迭代器,指向新插入的元素或映射中具有相同键值的元素。如果已经存在等价的键,则设置为false。而如果是直接用一个值去删除比如s.erase(3),编译器会自己去调用find,如果在就删除(返回删除的个数),不在就不会做任何事情(删除失败返回0)。插入的是一个键值对,返回的也是一个键值对,iterator就是指向value_type的指针。set是Key模型的二叉搜索树,它不仅能排序还能去重,底层实际上是用红黑树实现的。..

2022-08-18 12:00:53 686

原创 C++AVL树

只有满二叉树(2^h-1)才能保证每个子树高度差是0,所以退而求其次,AVL树保证每一个子树高度差都不超过1。// 三叉链是为了更新平衡因子时更好地回溯{// 右子树-左子树的高度差int _bf;:_kv(kv), _bf(0){}// AVL树并没有规定必须要设计平衡因子// 只是一个实现的选择,方便控制平衡};...

2022-08-18 11:59:31 73

原创 C++红黑树

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。思考:为什么满足上面的性质,红黑树就能保证:其最长路径中节点个数不会超过最短路径节点个数的两倍?最长的路径不会超过最短路径的两倍最短:全黑最长:一黑一红间隔1.4 红黑树的插入大家说插入一个新节点是红的好还是黑的好?如果插入节点的父亲是黑色的,就不需要调整,满足红黑树的定义。红黑树是在二叉搜

2022-08-18 11:55:31 104

原创 map和set的模拟实现

因为map的_date是pair,虽然pair比较大小能通过编译,但并不是我们预期的效果,pair本身比较大小是key小就小,如果不是,则value小的小。为了实现pair的正确比较大小,我们在RBTree的模板参数中增加一个KeyOfT的仿函数,它的作用是支持取出T对象中的Key。map和set底层都是红黑树,为了实现更高维的泛型编程,便于复用,我们让map和set用同一颗红黑树。(SGI源码也是这样的)根据需求改造我们的红黑树,我们不用像库里面继承搞那么复杂,我们用一个模板参数T来控制。...

2022-08-18 11:54:15 284

原创 C++多态收尾

ok,这里我们可以看到base1的虚表里面有一个重写的func1,有一个func2,有一个func3,func3是子类的,也就是说子类自己单独增加的没有重写的虚函数会放在第一个虚表,不会放在第二个虚表。大家说这里的执行顺序是怎么样子的呢?因为它们现在就和多继承一样,各自有各自的虚表,子类对象D有一个B,有一个C,B有一个虚表,C有一个虚表,各自玩各自的,反正A有两份,无所谓。还有一个问题,如果我在B中增加一个虚函数func1,B继承了A,C继承了A,现在只有同一份A,那B、C的虚函数都往A的虚表里面放吗?.

2022-08-18 11:51:37 84

原创 栈OJ(C++)

st正常push数据,对于minst如果最小值更新,就push更新后的最小值,如果没有更新则push之前的最小值。这道题其实没有什么好的解法,我们用一个栈来模拟:我这个入栈序列是不是能模拟出出栈顺序,能就符合true,模拟不出来就符合false。中缀就是运算符在两个数字或者表达式中间,但是中缀计算机没法计算,因为计算机是一个一个读取表达式的数据,要涉及优先级。一个是正常存储数据的栈,一个是存最小值的栈。(2)入栈序列已经走到尾了,说明数据一定在栈中,只是顺序不对,出栈序列非法。1、入栈序列先入栈。...

2022-08-18 11:42:52 139

原创 归并外排序实现

我们这里就需要归并,把文件分成一段一段的数据,对每一段数据进行排序(这里使用快排)再写进小文件,最后对每一个小文件进行归并。我们这里模拟的问题是:假设有海量数据待排序,那么数据一般在文件中,我们假设这个海量数据无法加载到内存当中,内存没有那么大。归并排序实现文件排序,对小文件排序是没有意义的,最终目的是为了排序大文件,我们这里100个数据只是进行模拟。我们这里的归并是依次读取每一段排序后的文件进行归并,不需要随机访问,效率相对而言较优。如果数据存储的不规范那就麻烦了,通常情况下都是规范的。......

2022-08-18 11:35:50 213

原创 【STL】模拟实现vector

我们模拟实现是为了加深对这个容器的理解,不是为了造更好的轮子。2. vector常用接口2.1 reserve跟string的扩容思路一样。一般不考虑缩容(n

2022-07-11 18:36:51 373 27

原创 【STL】vector

vector中文意思是向量,它是一个可以改变大小的动态顺序表。vector是一个类模板,它不仅可以存储int、double等类型,还可以存储string,严格来说vector可以存储任意类型。测试:测试:vs2019下测试:vs(PJ版本STL)下大概是1.5倍的增容。Linux下:g++(SGI版本STL)是按2倍增长的。单词增容增多少的分析:单次增容越多,插入N个值,增容次数越少,效率就越高。单次增容越多,可能浪费就越多。单次增少了,会导致频繁增容,效率低下,所以VS、Linu

2022-07-05 23:01:26 689 5

原创 LeetCode_7_5

[两数之和](1. 两数之和 - 力扣(LeetCode))2. 两数相加[两数相加](2. 两数相加 - 力扣(LeetCode))高精度加法,和我们做过的字符串相加有点像。(1)我们按位去加就可以了,考虑进位,每一位运算后还要重置进位。(2)链表不等长(2)如果两个链表等长且最后一位需要进位还要在末尾加上1。3.无重复字符的最长子串无重复字符的最长子串假设我们随机截取原串的一部分,然后这一部分恰好是没有重复字符的子串,我们就可以尝试向两边扩展。只有没有遇到与这一部分相同的字符就可以一路扩展下去。

2022-07-05 22:53:08 253 4

原创 模拟实现string类

我们循序渐进,不考虑string的增删查改,只考虑string的深浅拷贝问题。测试:'x’赋值给了这个函数调用表达式的返回值:我们当前所写的string类还面临着一个重大的问题。如果不主动编写拷贝构造函数和拷贝赋值函数,编译器将以“按成员拷贝(浅拷贝)”的方式自动生成相应的默认函数。倘若类中含有指针成员或引用成员,那么这两个默认函数可能隐含错误。以两个对象s1、s2为例。假设s1._str的内容为"hello world",现将s1拷贝构造给s2,默认拷贝构造函数的"按成员拷贝"将造成2个错误:(1)

2022-07-04 11:17:47 355 34

原创 C++之string(2)

string是C++标准库里的东西,严格来说不属于STL。所以说大家会看到STL里面,它把一些数据结构划分在Containers,也就是容器里面。但是string没有在这个地方,string在Miscellaneous headers里。STL是C++标准库的一部分,它是关于算法和数据结构的库。string类是basic_string类模板的一个实例化,它使用char(即bytes)作为其字符类型。basic_string类模板可以用wstring、u16string、u32string 作为其字符类型

2022-07-01 11:05:35 921 33

原创 C++之string

我等必将复起,古木已发新枝。

2022-06-03 00:09:24 3045 58

原创 C++之模板初阶

文章目录1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理3. 类模板3.1 类模板的定义格式3.2 类模板的实例化1. 泛型编程C++下一个针对C语言不足而设计的语法就叫作模板,模板的这种思想叫作泛型编程。泛型编程的意思是:我们以前C语言写代码是不是都是针对一种类型,比如我们写个Swap,写个排序,我们换一个类型,程序都得挂。而泛型编程不再是针对某种类型,能够适应广泛的类型。泛型编程用的一个东西就叫作模板。博主先带大家来举一个简单的范例:如何实现一个通

2022-05-31 16:33:56 597 45

原创 C/C++内存管理

文章目录1. C/C++内存分布1. C/C++内存分布我们先来看下面的一段代码和相关问题:int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = {1, 2, 3, 4};char char2[] = "abcd";char* pChar3 = "abcd";int* ptr1 = (int*)mallo

2022-05-27 17:21:57 1384 45

原创 关于编译器对连续的构造+拷贝构造/连续的拷贝构造的优化

一道很坑的题_(:з」∠)_:以下代码共调用多少次拷贝构造函数?// 《深度探索C++对象模型》Weight f(Weight u){ Weight v(u); Weight w = v; return w;}int main(){ Weight x; Weight ret = f(f(x)); return 0;}文章目录1 匿名对象2.匿名对象的用处3.题解3.1 铺垫3.2 解题1 匿名对象为了让大家更好地理解上面那道题,我们先来介绍一下什么是匿名对象?匿名对

2022-05-25 16:48:46 409 29

原创 重生之再学C语言:第一篇:VS2022+GitHub+博客

之前,这个专栏是博主小白时期记录C语言学习过程的笔记,那时候不懂排版,不懂Markdown,文章写的很粗糙。博主现在重新写这个专栏,希望能用经验给热爱编程准备入门的同学带来帮助。另外,也希望博主在任何时候都有推到再来的勇气。文章目录💖1. VS2022🌟1.1 安装🔥1.2 写一个文件验证环境☀️2. GitHub⚡️2.1 注册账号🌊2.2 创建仓库🐮2.3 GitHub DeskTop🐸3.博客🌺3.1 注册一个CSDN账号🍀3.2 写博客及一些简单的Markdown语法🌾3.3 添加表情💖1.

2022-05-24 23:08:21 2119 23

原创 C++类和对象(下)

文章目录1. 初始化列表1.1 初始化列表的概念1.2 初始化列表的价值2. explicit关键字2.1 隐式类型转换2.2 explicit3. static成员3.1 概念3.2 特性4. C++11 的成员初始化新玩法1. 初始化列表1.1 初始化列表的概念我们以前除了用构造函数来初始化类的成员变量,现在我们也可以通过初始化列表来初始化。前者为函数体内赋初值,后者为初始化列表初始化。虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能

2022-05-24 19:27:05 351 13

原创 C++类和对象(中)

文章目录1.类的6个默认成员函数2. 构造函数2.2 构造函数的特性1.类的6个默认成员函数大家认为下面这个Data类有没有成员函数?注意,它是有的。如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,编译器都会自动生成下面6个默认成员函数。2. 构造函数我们正常初始化是不是写一个Init成员函数,然后在外部调用初始化呀。在平常工作或者练习中,我们是很容易忘记初始化的,也有可能在我初始化之前,别人就调用print了,结果就会打印出随机值,甚至

2022-05-19 15:37:49 246 21

原创 手把手教你写一个日期计算器(C++)

放弃信念,无异死亡。文章目录💖1.声明日期类🌟2.构造函数和获取天数🔥2.1获取天数☀️2.2 构造函数⚡️*3.关系运算符重载🌊3.1 < 和 ==🐮3.2 <=🐸3.3 >🌺3.4 !=🍀3.5 测试🌾4. inline优化🌼*5 算术运算符重载🌙5.1 +🌏5.2 +=🎃5.3 +和+=谁复用谁比较好?🎉5.4 -=🎁5.5 - (Date-整数)🎅5.6 前置++和后置++🎄5.7 日期-日期 返回天数🔮6 关于拷贝构造函数的一些思考📷6.1 Date d2 = d1💻6.2.

2022-05-19 15:02:50 615 20

原创 C++之类和对象(上)

Will Rogers也一定会说:“没有自由变量这种东西。”——《C现代》文章目录1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1.访问限定符4.2 封装5.类的作用域6.类的实例化7.类对象模型7.1 如何计算类对象的大小7.2类对象的存储方式7.3 结构体内存对齐规则8.this指针8.1 this指针的引出8.2 this指针的特性1.面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是.

2022-05-14 15:53:31 393 9

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除