- 博客(49)
- 收藏
- 关注
原创 关于malloc的经典笔试题
这里在运行后会发现strcpy时是在将"hello"拷贝给一个NULL。这里就是将str释放后没有置为NULL,导致了非法访问。这个问题比较简单,就是没有释放malloc的空间。将str进行free后置为NULL即可。首先看第一个代码,看看有什么问题。把malloc的空间free即可。
2024-08-02 10:52:05
278
原创 【Linux基础I/O】软硬链接及动态库和静态库
Linux基础I/O我们就介绍到这里,当然这里面还有很多东西没有谈到,如果大家感兴趣可以自己去研究。另外这一部分也是很重要的基础,知道了linux的一切皆文件,库的知识,我们在后面使用就会更方便。
2024-05-17 10:32:36
891
1
原创 【Linux基础I/O】文件描述符及重定向
这篇文章只讲解了Linux的I/O的一半的内容,后面我们还要了解Linux的文件系统和动静态库和缓冲区的问题,希望大家可以继续关注。
2024-05-17 10:30:55
1869
1
原创 【C++进阶】特殊类的设计——单例模式详解
特殊类的设计我们只要知道常用的就可以了,单例模式还是比较的常用,所以要好好理解一下。下一节我们会带来C++的收尾内容,到这里我们C++的主要内容也快结束了,但是继续深挖C++的话还是有很多东西要学,所以希望大家可以持续学习,我也会带来更多的内容去分享。
2024-04-15 23:07:26
825
2
原创 【C++进阶】RAII思想&智能指针
这里我们也就讲完了智能指针了,智能指针还是很实用的。到这里我们C++的大部分重难点也就结束了。如果你到了这里,首先恭喜你坚持学习到了现在并且感受到了C++的独特之处。但是我们的学习还远没有结束,下一节我们会讲解类的设计模式中的常用的模式之一:单例模式。希望大家可以持续关注。
2024-04-14 22:55:33
797
1
原创 【C++进阶】C++异常详解
但是因为一些原因,C++的异常体系设计的不是那么的好用,所以大多数都是我们自己去用第三方的库或者自己实现一个异常体系。实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。这里C++ 异常的讲解就到这里了,我们引出了智能指针的概念和RAII的概念,还是比较重要的,我会在下一节重点讲解。希望大家可以对异常能有个很好的理解。
2024-04-11 20:52:35
1106
1
原创 【C++进阶】C++11(下)可变参数模板&lambda表达式&包装器
我们关于C++11的讲解就先到这里,当然还有很多新特性没有说到,像智能指针还有一些线程相关的,我们在后面再进行介绍。这里只是介绍了一些主要的更新。如果大家感兴趣可以自己去探索。
2024-04-10 21:50:02
906
1
原创 【C++进阶】C++11(上)列表初始化&右值引用移动语义
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。
2024-04-09 23:39:30
774
2
原创 【C++进阶】哈希的应用之位图和布隆过滤器
哈希这部分我们也算是讲解完了,哈希的用途还是非常的广。希望大家可以对哈希有一个深入的理解。C++学到这里其实也走过了大部分了,但是在这里我想说基础还是很重要的,基础越牢固,后面的学习才会更快。希望大家都可以打好基础,对C++有深入的学习。
2024-04-08 18:01:55
1059
1
原创 【C++进阶】哈希思想之哈希表和哈希桶&模拟实现unordered_map和unordered_set
哈希我们不陌生,在数据结构的排序部分我们实现过基数排序,这其实就是一种哈希思想的实现。哈希(也叫散列),是一种映射的思想(关键值和值建立一种关联关系)哈希表是哈希思想的一种实现。下面我们先来看一组关联式容器unordered_map/set。
2024-04-07 22:08:32
905
2
原创 【C++进阶】红黑树封装map,set(模拟实现)
我们讲解完了map和set的主要的一些接口,如果大家想看完整代码,可以查看我的gitee仓库:链接:map和set的封装下一节我们讲解哈希结构,在此之前也希望大家可以好好理解红黑树的原理,这一部分也是C++上难度的部分,经过了这一部分,后面的C++内容就会想对容易一些。
2024-04-07 16:26:22
464
3
原创 【C++进阶】详解红黑树&&手撕红黑树(模拟实现)!!!
如果parent的颜色为黑,则要调整,这里为了方便我们标记了parent节点为p,cur节点为c,grandparent节点为g,parent的兄弟节点为u。红黑树也是一颗二叉搜索树,相比于AVL树的插入,红黑树没有那么多的旋转,对平衡的检查没有那么的严格,所以是接近平衡的。找到位置后我们进行插入,进行调整颜色。如果我们插入的节点的parent的颜色为黑,则不需要调整,因为没有破坏平衡属性。我们插入的节点为红色,所以插入后可以确定的是p为红色,g为黑色。红黑树的插入是通过调整插入后节点的颜色来保证平衡的。
2024-04-07 14:48:17
761
1
原创 【C++进阶】深度解析AVL树及其简单模拟实现
之前我们学习了二叉搜索树,但是有时候因为节点插入的问题,可能会退化为单支树,这样会导致查找效率变得底下如顺序表。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度这种树就是AVL树.
2024-03-16 12:07:19
706
2
原创 【C++进阶】C++关联式容器map和set用法详解
在讲map的用法之前先说一下键值对pair,什么是键值对呢?用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和valuekey代表键值,value表示与key对应的信息。比如:现在要建立一个英汉互译的字典,那该字典中必然有英文单词与其对应的中文含义,而且,英文单词与其中文含义是一一对应的关系,即通过该应该单词,在词典中就可以找到与其对应的中文含义T1 first;T2 second;
2024-03-14 18:15:13
1040
1
原创 【C++进阶】详解二叉搜索树
当二叉搜索树退化为单支树时,其查找的优势就会失去,那么解决办法就是我们后面会讲的AVL树和红黑树了,所以我们要先掌握二叉搜索树,因为这些都是在此之上的知识。希望大家都能掌握并且可以持续关注,我会带来更多的C++知识。
2024-03-13 15:43:01
760
原创 【C++进阶】C++多态概念详解
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。在子类中对父类的虚函数进行重写,且必须调用。通过父类的指针或者引用调用虚函数那什么是虚函数及什么是重写,我们下面就来讲解public:cout
2024-03-12 22:18:34
1167
5
原创 【C++进阶】C++继承概念详解
C++面向对象有三大特性,分别是封装,继承,多态。前面我们了解了封装,在这一部分我们来看一下继承。派生类也叫子类,基类也叫父类有了多继承也就有了菱形继承,菱形继承其实来说是个C++的缺陷,比较复杂。除了继承之外,还有一种关系叫组合,继承实际上像一种is-a的关系,而组合更像是一种has-a的关系,也就是说继承是每个派生类对象就是一个基类对象而组合是说B组合了A,A包含在B中,每一个B对象都有一个A对象。对象组合是类继承之外的另一种复用选择。新的更复杂的功能可以通过组装或组合对象来获得。
2024-03-12 15:04:35
943
2
原创 【C++】反向迭代器&仿函数&模板进阶
在前面的讲解中我们可以利用迭代器来遍历容器,迭代器有正向迭代器和反向迭代器,在前面的模拟实现中我们都实现是正向迭代器,在这里我们来模拟实现一下反向迭代器。
2024-03-11 23:48:17
885
5
原创 【C++】STL容器适配器栈和队列及优先队列&容器适配器
stack我们都很熟悉,在数据结构中stack(栈)是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作在C++中,stack是作为容器适配器实现的,容器适配器我们下面会详解讲解,简单来说就是底层封装了其他容器,这里可以看到stack的默认容器是deque,deque我们也会在下面进行讲解,在此之上又提供了特定的函数来访问元素。下面直接来看使用queue。
2024-03-11 17:28:17
920
2
原创 【C++】list模拟实现&list迭代器失效问题
list的插入不会像vector造成迭代器失效,因为vector一旦发生扩容,其所有位置的迭代器都会失效,但是list不用扩容,当有元素插入时才创建节点,再链接到链表中。但是list的删除会造成迭代器失效,因为删除一个节点后,这个节点的迭代器位置实际上已经不存在了,再继续使用则会出错,除非下次使用时再给其赋值。list的底层是双向带头循环链表,所以我们先写一个节点的类,这个节点类也是一个类模板,由给定的数据类型生成相应的类。解决办法就是让删除后返回被删除节点的下一个节点的迭代器,下面是正确的使用场景,
2024-03-09 18:21:33
1894
2
原创 【C++】STL容器List的使用&vector和list的对比
list也和vector一样由类模板生成,使用时指定存储的数据类型,但是不同的是,list的底层空间不是连续的,而是双向链表。相比其他的容器,list的插入删除效率更高。list的底层是双向链表,所以其迭代器不像 vector 和 string 的迭代器是底层连续的,但是迭代器可以类似指针一样使用,在模拟实现部分我们会重点讲解。vector任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入时有可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低。
2024-03-09 11:26:38
1195
3
原创 【C++】vector的迭代器失效问题&深浅拷贝
先说一下什么是迭代器失效迭代器失效本质上来讲,就是在插入和删除后pos所指的位置不是更新后的位置,而是原来的位置。myvector(const myvector<T>& v) {//拷贝构造当进行拷贝构造时,被拷贝的数据是个二维数组时,就会出现两次析构的问题//vv1是一个两行两列的二维数组memcpy只是按照字节进行浅拷贝vv1的_start只是拷贝给了vv2的_start,但是没有将其所指向的这个二维数组拷贝给vv2所以对vv1和vv2进行析构时,会对同一块二维数组这个空间进行两次释放。
2024-03-08 16:56:50
620
2
原创 【C++】STL容器vector详解及简单模拟实现
vector底层是一个由类模板实例化而来的,不像string存储的是字符,vector可以存储各种不同的数据类型,包括内置类型和自定义类型。在vector部分我们需要不仅要掌握用法,还要知道其底层的一些原理。以及要清楚vector的迭代器失效等问题。
2024-03-08 15:41:58
841
3
原创 【C++】STL容器string详解
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架1. 原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP 版本–所有STL实现版本的始祖。2. P. J. 版本。
2024-03-04 23:31:48
683
1
原创 【Linux】进程地址空间的理解
在我们写程序时,都会有这样下面的内存结构,来存放变量和代码等数据。一个进程要执行,必须要有其对应的这样的内存结构。一个系统中有很多进程要执行,则要对应有很多进程空间。但是实际上的物理内存就那么大,无法给每一个进程都分配这么多的空间。则操作系统给每一个进程都划分了一个这样的虚拟的内存结构,这个虚拟的内存结构就叫做进程地址空间。
2024-02-18 17:29:51
721
2
原创 【C++】模板初阶
如果在C++中,存在这样一个模具,通过给这个模具中填充不同材料(类型),来获得不同材料的铸件(即生成具体类型的代码),那将会节省许多材料。类模板的实例化和函数模板的实例化不同,类模板的实例化需要在类模板名后跟上<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。在编译器编译时,编译器会根据传入的变量推演出函数模板参数的类型,再根据这个类型生成一份对应的代码。(和函数相对的是,函数模板传入的是类型,函数传入的是具体的变量),在。现在设想一个场景,需要交换两个变量的值。
2024-02-15 21:59:56
660
3
原创 【Linux】linux自动化构建工具make/makefile
是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。当对文件的内容做修改时,该文件的Modify和Change的时间都会被修改,所以当改变文件的属性时,修改时间发生了变化,再次make时,会比源文件的最近修改时间新。这里的mytest-d表示的是目标文件,test.c表示的是要编译的源文件,第二行则是编译指令。是一个命令,用来执行makefile里面编写的编译命令。
2024-02-04 23:48:08
635
1
原创 【Linux】linux权限
当我们在Linux下创建文件和目录时,都会有一个默认的权限这里创建一个文件:可以看到,该文件的默认权限是rw-rw-rw-,即默认是664。1.起始权限2.权限掩码共同决定的。其中:文件的起始权限是666,目录的起始权限是777那么,什么是权限掩码呢?可以通过umask来查看默认的权限掩码:注 :这里的第一个0表示8进制。也就是说,文件(目录)的最终权限是由起始权限和权限掩码通过一定的计算方法得来的。
2024-02-02 23:18:06
731
2
原创 【C++】详解类和对象(下)
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2023-11-09 23:39:16
110
1
原创 【C++】详解类和对象(中)
2.特性构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。例如:注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明例如:如下:注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,内置类型成员变量在类中声明时可以给默认值。例如:注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数(可以不用传参的构造函数),都可以认为是默认构造函数。例如:结果:看下面的代码:
2023-11-09 16:58:35
85
4
原创 【C++】详解类和对象(上)
C++中用class来代替structclass为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数// 类体:由成员函数和成员变量组成1.声明和定义全部放在类体中。成员函数如果在类中定义,编译器可能会将其当成内联函数处理。class Datepublic:// 无参构造函数是默认构造Date()_month = 1;_day = 1;
2023-10-31 17:24:42
82
4
原创 【C++】C++初级入门(收藏!!!)
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。C++提供了面向对象编程(OOP)的特性,如类、对象、继承、多态等,同时也支持过程化编程。C++被广泛应用于开发各种类型的应用程序,包括系统软、游戏、图形界面应用、嵌入式系统等。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// 命名空间中可以定义变量/函数/类型int val;//命名空间域可以嵌套int a;int b;
2023-10-26 17:55:39
104
2
原创 【数据结构】排序算法
于1962年提出的一种二叉树结构的交换排序方法,其基本思想为是,任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。交换排序的基本思想是,根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。的一个非常典型的应用。的记录分在同一组内,并对每一组内的记录进行排序。
2023-10-18 23:55:17
60
1
原创 【数据结构】二叉树
树(Tree)是n(n>=0)个节点的非线性有限集,直观看,树是以分支关系定义的层次结构。看起来像一个倒着的树,也就是根朝上的,叶是朝下的如下图:有一个特殊的结点,称为根结点,以上图为例,根节点为A节点,根节点有且仅有一个.除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<=m)又是一棵结构与树类似的子树(SubTree).每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的.注意。
2023-10-16 21:44:41
73
3
原创 数据结构(栈和对列)
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有。压栈:栈内数据的插入叫做压栈,入栈的数据在栈顶。出栈:栈内数据的删除叫做出栈,出栈的数据在栈底。
2023-08-15 10:34:13
155
4
原创 程序的环境和预处理
在编程中,开发人员可以利用这些预定义符号来简化代码的编写和理解。__FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义#define 机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏(macro)或定义宏(define macro)。参数列表的左括号必须与name紧邻。
2023-08-14 11:23:58
237
原创 C文件操作
磁盘上的文件是文件。在程序设计中,一般说的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)程序文件包括源程序文件(后缀为.c),目标文件(windows环境后缀.obj),可执行程序(windows环境后缀为.exe)数据文件文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。文件名文件名包含3部分:文件路径+文件名主干+文件后缀例如: D:\code\test.txt。
2023-08-13 16:13:06
260
1
原创 动态内存管理
有时会我们发现过去申请的空间太小了,有时候我们又会觉得申请的空间过大了,那为了合理的时候内存,我们一定会对内存的大小做灵活的调整。但是对于空间的需求,不仅仅是上述的情况。有时候也需要的空间大小在程序运行的时候才能知道,数组的编译时开辟空间的方式就不能满足了。当arr为空时,此时realloc的作用和malloc一样,会开辟SIZE个int大小的空间。这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间。2. 数组在申明的时候,必须指定数组的长度,所要的内存在编译时分配。
2023-08-12 16:13:29
177
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人