- 博客(58)
- 收藏
- 关注
原创 C++中智能指针的使用及其原理 -- RAII,内存泄漏,shared_ptr,unique_ptr,weak_ptr
内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射关系解除,物理内存也可以释放。⻓期运⾏的程序出现内存泄漏,影响很⼤,如操作系统、后台服务、⻓时间运⾏的客⼾端等等,不断出现内存泄漏会导致可⽤内存不断变少,各种功能响应越来越慢,最终卡死。
2024-11-28 23:43:34 1005
原创 C++中的异常处理
⼀般⼤型项⽬程序才会使⽤异常,下⾯我们模拟设计⼀个服务的⼏个模块每个模块的异常都是Exception的派⽣类,每个模块可以添加⾃⼰的数据最后捕获时,我们捕获基类的引用就可以了。下列程序要完整的运行成功就需要每个模块都调用成功,这里抛出异常的情况使用随机数取模进行模拟。
2024-11-24 11:56:07 696
原创 Linux环境下的基础开发工具 -- 包管理器,vim,gcc/g++,make/makefile,git,gdb/cgdb
在Linux下安装软件一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但是这样太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序) 放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包,直接进行安装。软件包和软件包管理器就好比"APP"和"应用商店"这样的关系。yum是Linux下非常常用的一种包管理器。主要应用在Fedora,RedHat,CentOS等发行版上。apt/apt-get主要应用在Ubuntu上。
2024-11-21 23:23:24 888
原创 C++11语法介绍(2) -- 可变参数模板,default和delete,final和override,lambda表达式,包装器
如果你提供了移动构造或者移动赋值,编译器不会⾃动提供拷⻉构造和拷⻉赋值。
2024-11-15 00:18:08 737
原创 C++11语法介绍(1) -- 列表初始化{},左值和右值,右值引用和移动语义,引用折叠,完美转发
在有些场景下带来的不少便利,如容器push/inset多参数构造的对象时,{}初始化会很⽅便。
2024-11-11 18:21:22 1034
原创 C++中unordered_map和unordered_set的介绍以及用哈希表封装实现unordered_map和unordered_set
unordered_set的声明如下,unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持将Key转成整形的仿函数传给第⼆个模板参数。unordered_set底层是⽤哈希桶实现,增删查平均效率是 O(1) ,迭代器遍历不再有序,为了跟set区分,所以取名unordered_set。1.2unordered_set和set的使用差异1.unordered_set和set的第⼀个差异是对key的要求不同,
2024-11-05 20:44:51 948
原创 C++中封装红黑树模拟实现map和set
2.set实例化rb_tree时第二个模板参数给的是key,map实例化rb_tree时第二个模板参数给的是pair,这样一棵红黑树既可以实现set,也可以实现map。要注意的是对于map和set,find/erase时的函数参数都是Key,所以第⼀个模板参数是传给find/erase等函数做形参的类型的。SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/set_tree.h等几个头文件中。,逻辑正好反过来即可,
2024-10-30 19:13:55 797
原创 Linux权限的概念以及Shell命令的运行原理
上述例子表面csq作为xiaoc.txt该文件的拥有者以及所属组成员,但是该文件的拥有者没有w权限,使用csq用户不能对该文件进行写操作,因为当前csq已经被匹配成该文件的拥有者了,拥有者没有w权限,虽然csq也是该文件所属组的成员,但是身份确认只确认一次,确认为拥有者就不会再确认为所属组成员了。umask的意义:默认权限是OS自主决定的,无法在创建前进行修改 -- umask使新建文件的预设权限可配置,是可以灵活满足需要的一种表现。凡是在umask中出现的权限,就是不希望在预设权限中出现的权限。
2024-10-28 14:10:12 1014
原创 C++中红黑树的实现
/如果为空树,插入的节点作为根//根必须为黑色//找到空位置else//插入节点//插入一个红色的节点else//如果出现连续的红色节点进入下列循环if (parent == grandfather->_left) //如果叔叔节点在右边//变色//继续向上更新else //叔叔不存在或者存在且为黑色if (cur == parent->_left) //插入到p的左边。
2024-10-26 15:20:45 1154
原创 初识C语言以及C语言常见概念
在VS上写代码,我们是需要创建项⽬的,直接新建项⽬就可以了。在项⽬中就可以添加源⽂件和头⽂件。C语⾔把 .c 为后缀的⽂件称为源⽂件,把 .h 为后缀的⽂件称为头⽂件。C语⾔中有⼀批保留的名字的符号,⽐如: int 、 if 、 return ,这些符号被称为保留字或者关键字。1.关键字都有特殊的意义。2.程序员自己在创建标识符的时候不能和关键字重复。3.关键字也是不能自己创建的。
2024-10-26 02:21:02 1057
原创 Linux基本命令
常用选项:-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖15. cat命令语法:cat [选项] [文件]功能: 查看目标文件的内容,适合看短文件。常见选项:-b 对非空输出行编号-n 对输出的所有行编号-s 不输出多行空行。
2024-10-25 18:57:22 979
原创 C++AVL树的介绍和实现
AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。
2024-10-13 15:03:12 827
原创 C++中map和set的使用
class set;T就是set底层关键字(数据)的类型。set默认要求T⽀持⼩于⽐较。set底层是⽤红⿊树实现,增删查效率是,迭代器遍历是⾛的搜索树的中序,所以是有序的。map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实现,
2024-10-12 13:24:00 890
原创 C++模拟实现二叉搜索树
二叉搜索树又称二叉排序树,(1)若它的左子树不为空,则。(2)若它的右子树不为空,则。(3)它的。(4)二叉搜索树,具体看使用场景定义。如下图,左边是不支持插入相等的值,右边支持插入相等的值。
2024-10-08 15:28:01 1179
原创 C++多态、虚函数以及抽象类
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数(虚函数),产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。
2024-10-05 13:29:37 1366
原创 C++模板进阶
一个程序(项目)又若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译。3.2模板的分离编译// a.h// a.cppint main()Add(1, 2);return 0;c/c++程序要运行,一般要经历以下步骤:预处理 -> 编译 -> 汇编 -> 链接。编译是对程序按照语言特性进行词法,语法,语义分析,错误检查无误后生成汇编代码,注意头文件不参与编译,编译器对工程中的多个源文件是分离开单独编译的。
2024-10-03 21:13:03 951
原创 C++仿函数的介绍以及priority_queue的介绍和模拟实现
仿函数的本质是一个类模板,只是这个类重载了operator(),所以当使用一个它的对象时看起来像使用和函数一样,所以被称为仿函数。int b = 10;return 0;自定义类型需要使用仿函数进行比较时,需要在自定义类型里面提供<和>等比较运算符的重载。
2024-10-02 16:54:15 1480
原创 C++中stack和queue的模拟实现
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另一个接口。如上图,需要将两个插口的插头转换为插座能使用的三个插口的插头,就需要一个适配器进行转换,适配器也可以叫做转换器。1.2STL标准库中stack和queue的底层结构虽然stack和queue中也可以存放元素,但是STL中并没有将其划分在容器的行列,而是将其称为容器适配器,
2024-10-02 15:30:52 995
原创 C++中vector类的使用
C++中的vector对应与C语言中的顺序表,底层还是通过数组来存储数据的。可以参考。vector类的接口我按照进行介绍,这里只进行常用接口的介绍,其他接口、类中的函数参数和函数重载若有需要请参考该网址,下列介绍就不一一列出了。vector的接口和string的接口很相似,可以参考进行对比。
2024-09-25 19:11:26 950
原创 C++中string类的模拟实现
这里首先先清除s中原有的数据,然后在栈里面开一个256大小的buff(为了减少扩容的次数).这里用get()函数一个一个读取输入的字符,如果用输入运算符的话会忽略输入的空格和换行符.当一个buff满了之后拷贝到s中,跳出循环后如果buff中还有遗留的数据,则全部拷贝到s中.尾插一个字符串.这里扩容保持一个对齐的原则,如果需要的空间大于原来空间的两倍,则需要多少开多少,如果小于原来的两倍,则开2倍.字符串的关系运算符与C语言中的compare()类似,这里直接复用库里面的compare()函数.
2024-09-19 18:28:58 1221
原创 C++中string类的使用
目录1.auto和范围for1.1auto关键字1.2范围for2.string类常用接口说明2.1默认成员函数2.1.1构造函数(constructor)2.1.2赋值运算符重载(operator=())2.2string类对象的访问及遍历操作(Iterators and Element access)2.3string类对象的容量操作(Capacity) 2.3.1利用reserve提高插入数据的效率2.4string类对象的修改及相关操作(Modifiers and String operations
2024-09-16 16:06:06 1315
原创 C++STL简介
在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。由Silicon Graphics Computer Systems。采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。由P. J. Plauger。由Rouge Wage。采用,不能公开或修改,可读性一般。,不仅是一个可复用的组件库,而且。
2024-08-27 21:07:20 153
原创 C++模板初阶
使用函数重载的缺点:(1)重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现就需要用户自己增加对应的函数。(2)代码的可维护性比较低,一个出错可能所以的重载均出错。泛型编程: 编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。C++中的模板就能实现这样的泛型编程:2函数模板。
2024-08-27 20:04:09 808
原创 C++中的内存管理
new的原理1. 调用operator new函数申请空间。2. 在申请的空间上执行构造函数,完成对象的构造。delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作。2. 调用operator delete函数释放对象的空间。new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。2. 在申请的空间上执行N次构造函数。delete[]的原理。
2024-08-27 17:06:40 696
原创 C++类和对象(4) -- 类型转换,static成员,友元,内部类,匿名对象,对象拷贝时编译器的优化
(3)内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。
2024-08-19 17:16:41 720
原创 C++类和对象(2) -- 构造函数,析构函数
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;
2024-08-17 14:48:42 1413
原创 C++类和对象(1) -- 类的定义,实例化,this指针
(1)class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的⽅法或者成员函数。 (2)为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。(3)C++中struct也可以定义类,C++兼容C中struct的⽤法,同时struct升级成了类,明显的变化是 struct中可以定义函数,⼀般情况下我们还
2024-08-13 15:30:21 845
原创 C++入门基础 -- 命名空间,C++中的输入输出,函数重载,引用
(1)定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。如上述代码中xiaoc这个命名空间。(2)namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以上⾯的rand不在冲突了。(3)C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-08-13 14:20:44 1079
原创 C语言实现归并排序
(1)归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。(2)时间复杂度:O(N*logN)(3)空间复杂度:O(N)(4)稳定性:稳定。
2024-08-10 20:15:04 616
原创 C语言实现计数排序
(1)创建一个新的数组,数组的大小K = 原数组中的最大值(max) - 最小值(min) + 1,用于统计相同元素出现的次数。(2)根据统计的结果按数组下标的顺序返回到原来数组中。
2024-08-07 14:51:01 231
原创 C语言实现希尔排序和堆排序
(1)希尔排序是对直接插入排序的优化(一定程度上防止了逆序的情况)。(2)当gap>1时都是预排序,目的时让数组更接近于有序。当gap==1时,数组已经接近有序的了,这样就会排的很快。整体而言,可以达到优化的效果。(3)希尔排序的时间复杂度不好计算,因为gap的取值方式很多,导致很难去计算,因此在好多书中给出的希尔排序的时间复杂度都不固定。如果gap按照gap = (gap / 3) + 1的方式来取值,这里给出一个大概的时间复杂度为O(N^1.3)。(4)稳定性:不稳定。
2024-08-05 14:06:21 465
原创 C语言实现常见O(N^2)的排序算法
1. 冒泡排序是一种非常容易理解的排序。2. 时间复杂度:O(N^2)。3. 空间复杂度:O(1)。4. 稳定性:稳定。
2024-08-05 13:27:38 1018
原创 C语言实现二叉树以及二叉树的详细介绍
树不同于之前的线性表,树是一种非线性的数据结构,由n(n>=0)个有限节点组成一个具有层次关系的集合。有一个特殊的节点称为根节点,根节点没有前驱节点。除了根节点外,其余节点被分成M(M>0)个互不相交的集合,其中每个集合又是一颗结构与树类似的子树。没一棵子树的根节点有且只有一个前驱结点,但是可以有0个或多个后继节点,因此树是递归定义的。 注:子树之间不能有交集。 (1) 结点的度:一个结点含有的子树的个数称为该结点的度; 如上图:A的为6.(2)叶结点或终端结点:度为0的结点称为叶结点; 如上
2024-07-18 14:40:48 692
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人