- 博客(27)
- 收藏
- 关注
原创 C++11新增特性——可变参数模板、lambda表达式、包装器
1、【概念】可变参数模板是C++11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板,这里主要针对函数模板的可变参数。在C++11之前,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来需要一定的技巧。在C++11之前其实也有可变参数的概念,比如printf函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数。
2025-04-05 14:37:04
521
原创 左值引用与右值引用详解
左值是一个表示数据的,比如:变量名、解引用的指针变量。一般地,我们可以获取它的地址和对它赋值,定义时const修饰符后的左 值,不能给他赋值,但是可以取它的地址。总体而言,可以取地址的对象就是左值。
2025-02-27 20:55:17
698
原创 AVL树详解
AVL树,又称为平衡二叉树,它基于二叉搜索树并通过平衡而得到。在数据结构中,二叉搜索树可以提高搜索数据的效率,但在数据有序的情况下会退化为单支树,此时在树中查找元素就得遍历一整个分支,时间复杂度也会退化至O(N)。AVL树的左右子树高度差不能超过1,也就是说每个节点的平衡因子的绝对值不能超过1;, _bf(0){}//节点的父节点T _data;//节点的值int _bf;// 节点的平衡因子。
2025-02-19 13:42:41
804
原创 c++ map和set功能详解
1. set是按照一定次序存储元素的容器。2. 在 set 中,元素的 value 也标识它 (value 就是 key ,类型为 T) ,并且每个 value 必须是唯一的。set中的元素不能在容器中修改( 元素总是 const) ,但是可以从容器中插入或删除它们。3.在内部, set 中的元素总是按照其内部比较对象 ( 类型比较 ) 所指示的特定严格弱排序准则进行 排序。
2025-02-17 14:02:41
786
原创 二叉搜索树
/分装每一个节点,定义成模板函数K _key;{}//搜素树的定义public:private:在BSTree类种主要实现四个函数:插入,删除,查找,中序遍历。(中序遍历搜索二叉树时得到的是有序的)下面为二叉树的代码实现,只有看了代码实现,才会对二叉树有了更深刻的认识创建一个二叉搜索树的过程,也就是不断的插入。插入的具体过程如下:1、树为空,则直接新增节点,赋值给root指针2、树不空,按二叉搜索树性质查找插入位置,插入新节点//如果树为空的情况。
2025-02-13 12:42:09
833
原创 C++多态详解
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态。基类的虚函数进行重写在继承中要构成多态还有两个条件(二者缺一不可):1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:virtual void BuyTicket() { cout << "买票-全价" << endl;
2025-02-11 18:38:58
680
原创 C++继承
1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。3. 实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。
2025-02-09 19:52:30
599
原创 string类
在string拷贝的时候,第三个参数len如果不传或者传大于拷贝字符串的长度,就是将第二个参数pos开始拷贝到字符串结束。对于string类型,可以用迭代器来访问,也可以用[ ]来访问。对于有const修饰的字符串不可被修改,没有则可以修改。拷贝构造,流插入和流提取。可以用对象加.操作符来访问。
2024-11-14 17:26:13
129
原创 C++模板
1. 函数模板函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本。函数模板格式注意:template 返回值类型 函数名(参数列表){}typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替 class)函数模板的实例化:用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化 和显式实例化1. 隐式实例化:让编译器根据实参推演模板参数的实际类型。
2024-11-05 22:24:38
230
原创 C++内存管理
1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口 创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。
2024-11-03 23:31:25
408
原创 C++类和对象
赋值运算符重载是⼀个默认成员函数,⽤于完成两个已经存在的对象直接的拷⻉赋值,这⾥要注意跟 拷⻉构造区分,拷⻉构造⽤于⼀个对象拷⻉初始化给另⼀个要创建的对象。赋值运算符重载的特点:1. 赋值运算符重载是⼀个运算符重载,规定必须重载为成员函数。赋值运算重载的参数建议写成 const 当前类类型引⽤,否则会传值传参会有拷⻉2. 有返回值,且建议写成当前类类型引⽤,引⽤返回可以提⾼效率,有返回值⽬的是为了⽀持连续赋 值场景。
2024-11-03 22:51:47
300
原创 C++类和对象
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数。
2024-10-27 22:36:07
231
原创 C++的类和对象相关知识详解
1、class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。2、定义在类⾯的成员函数默认为inline。C++ 升级 struct 升级成了类1 、类⾥⾯可以定义函数2 、 struct 名称就可以代表类型不再需要 typedef , ListNodeCPP 就可以代表类型。
2024-10-27 21:28:29
1195
原创 内敛函数 和 nullptr
⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
2024-10-27 20:57:03
163
原创 进程的创建和终止
在程序创建子进程的时候,子进程和父进程的代码和数据是一起的,权限会更新成只读的;当子进程写入的时候会触发系统的错误发生缺页中断(权限的不匹配),此时系统会发生判定是否需要写时拷贝,如果需要,系统会将父进程的数据区进行拷贝一份,让子进程对拷贝的数据进行修改。申请内存,发生拷贝,修改页表,权限的更新。为什么要有写时拷贝????为了节省内存空间子进程和父进程的大部分数据都相同,不一定要全覆盖,写时拷贝有效节约了内存空间;
2024-10-27 20:40:07
460
原创 C++命名空间作用域
域:名字的隔离;影响查找规则1、作用域 限定符(指定)2、命名空间作用域可以嵌套3、多个文件可以定义同名的命名空间,在调用的时候会合并查找顺序规则:a、当前局部域b、全局域(不会到其他的命名空间作用域找)c、展开的命名空间作用域using namespace std->官方库展开命名空间作用域=>也有好处也有坏处,不能随便展开存在默认查找顺序,不太怕冲突4、指定展开某一个using bitx影响生命周期=>局部域=>全局域不影响 ->命名空间作用域。
2024-10-26 17:57:37
389
原创 Linux常见指令大全
dst目录: 把指定的目录(默认是当前目录)下,新建并拷贝src,拷贝的文件或目录的名称就叫做dst。date +%Y-%m-%d/%H:%M:%s -d@时间戳=>显示时间戳所在时间。dst文件:在指定的目录(默认是当前目录)下,新建并拷贝src。本应该从键盘输入的数据变为从指定文件读取数据。5、touch创建普通文件(如:touch ./test.c)mv src(文件,目录) dst(文件,目录)-l命令选项(显示更详细的文件内容)快捷=>ll。13、op src(文件,目录) dst(文件,目录)
2024-10-25 15:44:19
331
原创 Linux进程的切换
1、代码不会执行了——首先可以立刻释放的就是进程对应的程序信息数据退出2、进程退出,要有退出信息(进程的退出码)保存在自己的task_struct内部3、管理结构task_struct必须被OS维护起来,方便用户未来进行获取进程退出的信息task_struct->是进程的PCB进程=内核数据结构+代码和数据结构体->成员属性->退出信息(int code,其他信息)
2024-10-20 22:54:53
1964
原创 Linux权限问题、粘滞位和安装软件
权限理解:Linux下分为普通用户和超级用户普通用户之间不能切换超级用户通过:(root) su xxx可以转变为普通用户对普通用户执行一条命令(提权)(权限=>文件权限)sudo对普通用户进行提权sudo 命令=>以超级用户执行=>>不允许普通用户进行提权操作(在系统中存在白名单,而白名单属于root)1、对文件来讲,存在三种身份:拥有者,所属组,other(一个人只能有其中之一)身份决定他可以做什么操作(为了进行更细致的权限管理)权限=人+文件属性。
2024-09-20 17:19:13
467
1
原创 c语言扫雷代码设计和实现(最后有源码)
扫雷作为作为一款风靡全国的经典游戏,其玩法想必不必赘述。代码分为三个部分,game.h(头文件,用于函数的声明)game.c(源文件,用于游戏部分的实现),test.c(源文件,用于游戏的主函数和代码测试)
2023-12-11 10:44:04
103
1
原创 循环语句——while和for和do...while
在for循环中初始化、判断和调整都集中于for旁边的括号中,更加集中化。不管是看起来还是在语法使用中都更方便、不容易错,因此我更倾向于使用for循环。do..while与while循环类似,唯一的区别在于do...while是先执行一遍,再循环判断。在while旁边括号里的表达式中”0“为错误,不执行循环;而非”0“为正确,执行循环。while是c语言循环语句中三种循环的一种,还有for、do...while。而在while表达式中下面一般一段调整代码,如果不加很有可能会变成死循环。
2023-12-08 23:44:31
82
原创 分支语句——switch
而在上面代码中,每一个care语句下面都跟着一个break(break的作用是跳出),其目的就是跳出switch,否则就会出现下面情况。每个care都是一个分支,care后面的1、2可以换成表达式的任意分支,而最后的default就是表达式最后剩余的情况。如果不跳出,代码就从分支的那个care开始执行,直到遇到break或switch语句执行完毕。注意:defence与care的顺序在switch语句中并没有要求。1、通常与care、default连用。二、分支结构——switch。
2023-12-08 22:33:59
53
原创 分支语句——if
总结:对于if语句相对于while是经常使用的,if的我们日常的思维中应该是判断,当我们需要判断逻辑的时候,例如判断一个数是不是双数,就可以使用if。这样不仅仅更好看,也写的代码可读性也更强,更不容易犯错。这样对于匹配的if和else就会在一个大括号中,不会出现对于匹配问题的误判。2、if语句中可以嵌套多个if语句(感觉还是很自由的)我的建议是在每条if或else语句下面都用大括号,如。循环结构包括while、do..while、for。3、对于if和else的匹配问题。、分支结构包括if和swift。
2023-12-08 18:47:50
85
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人