Linux——cgdb的使用 cgdb 是一个基于 GDB 的图形化调试前端,结合了命令行界面的功能和代码查看窗口。它主要是为开发者提供一个更为直观的调试体验,使得在调试程序时既能利用 GDB 强大的调试能力,也能同时查看代码,使得调试过程更加高效和便捷。
c++11新特性——智能指针 unique_ptr的定义在头文件中,它是一个模板类,可以管理任何类型的动态分配对象。其中,T是unique_ptr所管理对象的类型,Deleter是一个删除器,用于在unique_ptr销毁时释放对象。默认情况下,使用std::default_delete作为删除器。删除器是一个函数对象(可以是函数指针、函数对象或lambda表达式),它定义了当unique_ptr销毁时如何释放其所管理的资源。
C++11新特性(列表初始化与右值引用折叠与完美转发) Function(T&&t)函数模板程序中,假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,再结合引⽤折叠规则,就实现了实参是左值,实例化出左值引⽤版本形参Function,实参是右值,实例化出右值引⽤版本形参的Function。像f2这样的函数模板中,T&& x参数看起来是右值引⽤参数,但是由于引⽤折叠的规则,他传递左值时就是左值引⽤,传递右值时就是右值引⽤,有些地⽅也把这种函数模板的参数叫做万能引⽤。2,左值引用可以被赋值,但不能用于移动语义。
Linux的makefile与进度条小程序实践 变量可以使用 = 或 := 定义VAR = value # 延迟赋值VAR := value # 立即赋值变量在命令中可以用 $(VAR) 访问$@:目标文件的名称。$
C++——红黑树(带头结点) 红黑树是一种自平衡的二叉搜索树,具有以下几个重要特性和规则,确保其在插入、删除和查找操作中的时间复杂度保持在 (O(\log n))。红黑树的基本概念节点颜色:每个节点都有一个颜色属性,可以是红色或黑色。节点结构:每个节点除了存储数据,还包含指向左右子节点和父节点的指针,以及颜色信息。
平衡二叉树——AVl树 从插入节点的父节点开始,逐级向上检查每个祖先节点的平衡因子(Balance Factor, BF),即左子树高度减去右子树高度(BF = height(left) - height(right)),或者相反。AVL树是一种二叉搜索树,意味着每个节点都有一个键值,左子树的所有节点值小于该节点的值,右子树的所有节点值大于该节点的值。AVL树在插入或删除节点时,通过旋转操作来保持树的平衡,以确保所有基本操作的时间复杂度为 O(log n)。节点的高度是其左子树和右子树高度的最大值加一。
关联式容器——map与set 如图为官网的英文介绍set的定义语法T就是set底层关键字的类型set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。set底层是⽤红⿊树实现,增删查效率是 ,迭代器遍历是⾛的搜索树的中序,所以是有序的。
数据结构——二叉搜索树 在二叉搜索树(BST)中,查找某个节点的步骤非常简单,因为 BST 的特性保证了每个节点的左子树中的所有节点值都小于该节点的值,右子树中的所有节点值都大于该节点的值。如果树是自平衡的(如 AVL 树或红黑树),可能需要调整树的平衡性,例如通过旋转操作来维持树的平衡。:要删除的节点有两个子节点找到该节点的右子树中最小的节点(即“后继节点”),将这个后继节点的值替换到要删除的节点,然后删除后继节点。在最坏情况下,例如树退化成链表(所有节点只有一个子节点),树的高度变为 N,操作的时间复杂度变为 O(N)。
C++——多态的原理 ⼀个含有虚函数的类中都⾄少都有⼀个虚函数表指针,因为⼀个类所有虚函数的地址要被放到这个类对象的虚函数表中,虚函数表也简称虚表。但是要注意的这⾥继承下来的基类部分虚函数表指针和基类对象的虚函数表指针不是同⼀个,就像基类对象的成员和派⽣类对象中的基类对象成员也独⽴的。派⽣类的虚函数表中包含,基类的虚函数地址,派⽣类重写的虚函数地址,派⽣类⾃⼰的虚函数地址三个部分。派⽣类中重写的基类的虚函数,派⽣类的虚函数表中对应的虚函数就会被覆盖成派⽣类重写的虚函数地址。基类对象的虚函数表中存放基类所有虚函数的地址。
C++——多态 在C++中,多态(Polymorphism)是指不同的对象可以通过相同的接口进行操作的能力。多态性是面向对象编程中的一个重要特性,允许程序在运行时决定调用哪个方法,从而使得代码更加灵活和可扩展。静态多态和动态多态。协变指的是在继承层次中,类型系统如何处理函数返回值的类型关系。具体来说:如果一个类型 B 是类型 A 的派生类(即 B 是 A 的子类),并且你有一个返回 A 类型对象的函数,那么你可以将这个函数重写成返回 B 类型对象的函数。这是协变的例子。
STL——栈和队列和优先队列 学到这里对于容器的基础内容都是大概掌握了的,所以直接讲重点栈(Stack)栈是一种后进先出(LIFO, Last In First Out)的数据结构,类比为一个容器,你只能从容器的顶部(栈顶)添加或移除元素,不能在中间或底部进行操作。压入(Push):将元素放入栈顶。弹出(Pop):从栈顶移除元素。查看栈顶元素(Top):查看但不移除栈顶元素。判空(Empty):判断栈是否为空。大小(Size):获取栈中元素的个数。
c++——vector容器详解 C++ 中的 std::vector 是一个动态数组,是标准模板库(STL)中的一个重要容器。它提供了动态大小、快速随机访问和插入/删除操作的能力,使其成为处理动态数据集合的常用选择。vector——向量向量是表示大小可以变化的数组的序列容器。就像数组一样,向量对其元素使用连续的存储位置,这意味着也可以使用指向其元素的规则指针上的偏移量来访问其元素,并且与在数组中一样有效。但与数组不同的是,它们的大小可以动态变化,容器会自动处理它们的存储。在内部,向量使用动态分配的数组来存储其元素。
c++——string详解 string是表示字符序列的对象, 与普通的char*不一样,本质上是一个类,内部封装了各种函数。标准字符串类通过类似于标准字节容器的接口为此类对象提供支持,但添加了专门设计用于处理单字节字符字符串的功能。字符串类是 basic_string 类模板的实例化,它使用 char(即字节)作为其字符类型,以及其默认的 char_traits 和分配器类型(有关模板的更多信息,请参阅basic_string)。
C++——模板的奥秘 template 或 template :声明一个模板,T 是类型参数,可以是任何合法的类型,包括内置类型(如 int, double)或自定义类类型。T functionName(T parameter1, T parameter2, …):定义一个模板函数,参数和返回类型都是类型参数 T。函数体内的操作可以使用类型参数 T 定义的任何操作。template 或 template :声明一个模板,T 是类型参数,可以是任何合法的类型,包括内置类型(如 int, double)或自定义类类型。
C++——类和对象(初始化列表和运算符重载与静态与友元) / 初始化数组// 初始化向量在构造函数中的初始化:public:int x;double y;// 构造函数使用初始化列表// 构造函数体在上面的例子中,Example类的构造函数使用初始化列表来初始化成员变量x和y。// 增加操作数的值// 返回增加后的操作数ReturnType:是返回值的类型,通常是引用类型,以便支持连续操作。operator++:是前置加加运算符的函数名,用于重载前置加加运算符。():代表这是一个函数调用。
C++——类与对象 在C++中,类(Class)是一种用户定义的数据类型,用来封装数据(成员变量)和方法(成员函数),关键字为class。可以取代C语言中的结构体,并且功能更全面。析构函数的名称与类名相同,前面加上波浪号(~),不接受任何参数,也没有返回值。它在对象被销毁时自动调用。public:// 构造函数// 析构函数。
C++入门——命名空间与输入输出与缺省参数与重载函数与引用与内联 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不在冲突了。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。