自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C语言入门级教学】递归与迭代1

在这个解题的过程中,我们就是使⽤了⼤事化⼩的思路 把Print(1234)打印1234每⼀位,拆解为⾸先Print(123)打印123的每⼀位,再打印得到的4 把Print(123)打印123每⼀位,拆解为⾸先Print(12)打印12的每⼀位,再打印得到的3 直到Print打印的是⼀位数,直接打印就⾏。有⼀种有特殊情况是:当 n==0 的时候,n的阶乘是1,⽽其余n的阶乘都是可以通过上⾯的公式计算。求n的阶乘 ⼀个正整数的阶乘(factorial)是所有⼩于及等于该数的正整数的积,并且0的阶乘为1。

2026-05-24 22:55:28 3566

原创 【C语言入门级教学】函数的概念2

⽐如:我们要写⼀个函数判断⼀年是否是闰年。//判断⼀年是不是闰年return 1;}//这部分属于函数的定义int main()int y = 0;//函数的调用if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;if(r == 1)printf("闰年\n");elseprintf("⾮闰年\n");return 0;

2026-05-24 22:55:14 2441

原创 【数据结构】八种常见的排序算法

思路: 创建左右指针。⾸先从右向左找出⽐基准⼩的数据,找到后⽴即放⼊左边坑中,当前位置变为新的"坑",然后从左向右找出⽐基准⼤的数据,找到后⽴即放⼊右边坑中,当前位置变为新的"坑",结 束循环后将最开始存储的分界值放⼊当前的"坑"中,返回当前"坑"下标(即分界值下标)稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的 相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,⽽在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;

2026-05-24 22:54:46 10707 18

原创 【C++】string类扩展知识

在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。

2026-05-24 22:54:35 2530 1

原创 【C++进阶】继承前置知识

下面我们看到Person是基类,也称作父类。Student是派生类,也称作子类。(因为翻译的原因,所以既叫基类/派生类,也叫父类/子类)

2026-05-26 13:39:25 372

原创 【Linux】shell与权限

2026-05-26 13:39:04 14

原创 【Linux】基础指令

当该命令执行后输出两个文件路径,这意味着在用户主目录及其子目录下,找到了两个名为 test.c 的文件,每个文件路径代表一个找到的 test.c 文件的具体位置。例如,可能一个文件的路径是 ~/project1/test.c,另一个文件的路径是 ~/project2/test.c,这表明在 project1 和 project2 这两个项目目录下都存在 test.c 文件。命令是 Linux 系统中功能最强大的文件搜索工具之一,它可以在指定的目录结构中递归搜索文件,并根据多种条件执行相应的操作。

2026-05-24 22:56:20 430

原创 【Linux】自存Linux历史

2026-05-18 21:48:02 13

原创 【C++】模板进阶全内容,一篇搞定所有!!!

一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

2026-05-18 21:45:43 1053

原创 【C++】经典易错题(2)

因为所有类模板的成员函数,放在类外定义时,需要在函数名前加类名,而类名实际为ClassName,所以定义时还需加模板参数列表。C.模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换,意思就是实例化后的代码在运行时不再进行额外的类型校验,故错误。A. 模板实参省略意思为隐式实例化,一般情况下都使用隐式实例化,不需指定模板类型参数,让编译器进行推导。类型参数:即类型参数化,将来实例化为具体的实际类型,有点像函数的形参,形参可以接受不同值的实参。D.只要支持模板语法,模板的代码就是可移植的。

2026-05-11 14:48:10 21

原创 【C++】priority_queue和仿函数(四)

仿函数是C++中一种行为类似函数的对象。它通过重载 operator() 来实现,可以像普通函数一样被调用,但又具备对象特有的属性(如存储状态、作为模板参数等)基本实现Less less;// 创建仿函数对象// 调用 operator(),等价于 less.operator()(3,5)// 使用 Less 得到升序排列(或大堆/小堆取决于容器语义)int());// 升序int());// 降序带状态的仿函数示例public:Counter c;// 输出 123。

2026-05-11 14:47:54 189

原创 【C++】容器适配器(三)

容器适配器的作用可以概括为:将一个通用的底层容器,转换为一个具有特定行为接口的专用数据结构。提供特定的语义stack 实现 LIFO(后进先出),只允许在容器尾部插入、删除、访问。queue 实现 FIFO(先进先出),只允许尾部插入、头部删除和访问。priority_queue 实现 按优先级取出(默认最大堆),每次取出的都是当前最大(或最小)元素。限制接口,隐藏不相关操作底层容器(如 deque、vector)通常支持迭代器、随机访问、任意位置插入删除等灵活操作。

2026-05-10 15:52:50 467

原创 【C++】queue(二)

翻译:队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。队列作为容器适配器实现,,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用push_back:在队列尾部入队列。

2026-05-10 15:52:41 174

原创 【C++】stack(一)

stack的文档介绍。

2026-05-09 17:12:02 27

原创 【C++】string,vector和list对比

o 专门提供字符串操作:c_str()、find()、substr()、append()、replace() 等。o 提供 splice()(节点转移)、merge()(合并有序链表)、sort()(归并排序)等特有操作。o 有小字符串优化(SSO),短字符串(通常 15 字节以内)存储在对象内部,避免堆分配。o 支持 reserve()、capacity()、shrink_to_fit()。o 不支持随机访问,因此没有 operator[] 或 at()。o 支持与 C 字符串及字符数组的互操作。

2026-05-09 17:11:45 65

原创 【C++】List的模拟实现(2)

通过前面例子知道,反向迭代器的++就是正向迭代器的–,反向迭代器的–就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。当你写出 it->_a1 时,编译器会将其解释为 it.operator->()->_a1。it.operator->() 被调用,它返回一个 A* 类型的指针(指向当前迭代器所指向的 A 对象)。然后编译器对这个返回的指针应用 -> 运算符,访问指针所指向对象的 _a1 成员。为什么需要“两次解引用”?

2026-05-07 12:53:53 172

原创 【C++】List前情提要

list的文档介绍是带头双向循环链表,能实现任意位置插入删除,时间复杂度是O(1)

2026-05-06 23:44:35 332

原创 【C++】vector 在OJ中的使用

复习一下异或(^)异或运算的基本性质恒等律:任何数与0异或的结果是其本身,即 X ⊕ 0 = X。归零律:任何数与自身异或的结果是0,即 X ⊕ X = 0。交换律:异或运算满足交换律,即 A ⊕ B = B ⊕ A。结合律:异或运算满足结合律,即 (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)。

2026-05-06 23:44:26 613 1

原创 【C++】vector深度剖析及模拟实现

用souce insight这个软件可以方便地查看源码下面这段源码是将数据分两段拷贝,在数据中间插入x。

2026-05-05 20:40:04 505

原创 【C++】vector介绍

vector的文档介绍Vecctor是一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小vector的构造代码演示//下标遍历i++)//范围for遍历//迭代器遍历while (it!//构造一个某类型的空容器//插入10个数据,初始化为1//左闭右开的区间//拷贝构造Print(v2);Print(v4);

2026-05-05 20:39:40 171

原创 【C++】string的经典算法题

当剩余字符在 k 到 2k 之间时,i + k 可能小于 n,所以反转前 k 个,后面的保持不变。注意,因为 i 每次增加 2k,所以下一个块从 i+2k 开始,而当前块的后 k 个字符(如果有)不会被反转,符合要求。如果 i + k > n,那么 last = n,反转从 i 到 n-1 的字符,即剩余的全部字符。分析:如果 i + k <= n,那么 last = i + k,反转从 i 到 i+k-1 的字符,即前 k 个。例如:[0,10),个数:10。例如:[0,9],个数:10。

2026-04-29 22:51:29 882 1

原创 【C++】string类基础知识

c_str() 是 C++ 标准库中 std::string 类的一个成员函数,它返回一个指向以空字符(‘\0’)结尾的字符数组的指针,该数组包含了与 string 对象相同的字符序列。C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合面向对象的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。

2026-04-29 22:50:50 386

原创 【C++】STL简介

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2026-04-28 20:09:54 328

原创 【C++】经典且易错的题

分析:1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在, 因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象。B. inline函数不支持声明和定义分离开,因为编译器一旦将一个函数作为内联函数处理,就会在调用位置展开,即该函数是没有地址的,也不能在其他源文件中调用,故一般都是直接在源文件中定义内联函数的。C.inline函数会在调用的地方展开,所以符号表中不会有inline函数的符号名,不存在链接冲突。

2026-04-28 20:09:38 46

原创 【C++】类的默认成员函数下(内含日期类的实现)

所以这里自定义类型传值传参和传值返回都会调用拷贝构造函数。4.若未显式定义拷贝构造,编译器会。

2026-04-27 16:59:25 1256

原创 【C++】模板初阶

class 类模板名// 类内成员定义// 类模版public:_top = 0;// 扩容++_top;

2026-04-27 16:59:07 884

原创 【C++】内存管理全解,懂一点赚一点!

new/delete 和 malloc/free最大区别是 new/delete对于自定义类型除了开空间还会调用构造函数和析构函数class Apublic:: _a(a)~A()private:int _a;int main()//malloc后很难初始化free(p1);//new/delete会调用构造函数和析构函数delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);

2026-04-26 12:17:29 1588

原创 【C++】友元+内部类+匿名对象+拷贝时的编译优化

当前主流的相对新⼀点的编 译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译器还会进⾏跨⾏跨表达式的合并优化。• 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到。• 如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。,如果A是B的友元,B是C的友元,但是A不是C的友元。,⽐如A类是B类的友元,但是B类不是A类的友元。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是。位置,那么A类就是B类的。

2026-04-26 12:17:15 224

原创 【C++】构造函数+类型转换+static成员

(原因:这三类必须在定义时初始化,其他都是用对象整体定义),普通成员可以在初始化列表的位置初始化,也可以在构造函数内初始化,所以。既用初始化列表,又用函数体的情况(初步的初始化是用初始化列表,更复杂的(例如下面的检查)在函数体内),但是整体都叫初始化。,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不会用构造函数初始化列表。答案选D,因为初始化列表中按照成员变量在类中声明顺序进⾏初始化,先初始化_a2,后初始化 _a1。,如果这个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。

2026-04-25 19:24:20 329

原创 【C++】类的默认成员函数(上)

6.无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。

2026-04-25 19:24:10 720

原创 【数据结构】经典且易错的题

1.一个栈的入栈序列为ABCDE,则不可能的出栈序列为( )

2026-03-26 12:50:49 96

原创 【C++】C++和C语⾔实现Stack对⽐

⾯向对象三⼤特性:封装、继承、多态,下⾯的对⽐我们可以初步了解⼀下封装。通过下⾯两份代码对⽐,我们发现C++实现Stack形态上还是发⽣了挺多的变化,底层和逻辑上没啥变化。,通过访问限定符进⾏了限制,不能再随意通过对象直接修改数据,这个是最重要的变化。这⾥的封装的本质是⼀种更。,避免出现乱访问修改的问题。当然封装不仅仅是这样的,我们后⾯还需要不断的去学习。数据和函数封装到一起,都在类里面。• C++中有⼀些相对⽅便的语法。C++实现Stack代码。的⼀种体现:C++中。C实现Stack代码。

2026-03-26 12:50:31 74

原创 【c++】隐藏的this指针

• Date类中有Init与Print两个成员函数,函数体中没有关于不同对象的区分,那当d1调⽤Init和 Print函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?那么这⾥就要看到C++给了⼀个隐含的this指针解决这⾥的问题• 编译器编译后,类的成员函数默认都会在,增加⼀个当前类类型的指针,叫做this指针。⽐如Date类的Init的真实原型为 void Init(Date* const this, int year, int month, int day),但是内容是可以修改的。

2026-03-25 11:41:17 1055

原创 【C++】类的定义和实例化

• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。private:// 为了区分成员变量,⼀般习惯上成员变量。

2026-03-25 11:40:53 1637

原创 【c++】nullptr详解

空指针的值通常为 nullptr 或 NULL,其中:nullptr 是 C++11 引入的关键字,用于表示空指针,具有类型安全性。它的类型是。NULL 是早期 C 语言中用于表示空指针的宏定义,通常定义为((void*)0)。

2026-02-17 07:45:00 1057

原创 【c++】inline函数详解

1.inline对于编译器⽽⾔只是⼀个建议,也就是说,加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。因为inline被展开,就没有函数地址,链接时会出现报错。⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就。

2026-02-16 07:30:00 1059

原创 【C++】c++中“引用”的详解

​ 引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。比如:水浒传中林冲,外号豹⼦头​ 类型&引⽤别名=引⽤对象;​ C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<<和>>,这⾥引⽤也和取地址使⽤了同⼀个符号&。TIP]如何区分取地址和引用呢?&i->在变量之前是取地址int&->在类型之后是引用int main()int a = 0;// 引⽤:b和c是a的别名int& b = a;

2026-02-10 07:30:00 1171 1

原创 【数据结构】二叉树经典算法题和选择题

后序遍历最后的结点是根结点,在中序遍历中,根结点左边是左子树,右边是右子树(只有b),在后序遍历中c在dec中排最后,所以c是右子树的根结点,再从中序遍历中看c,c的左边是左子树d,右边是右子树e,所以选D。证明上述性质: 假设⼀个⼆叉树有 a 个度为2的节点, b 个度为1的节点, c 个叶节点(二叉树的结点只有三种情况:度为0,1,2),则这个⼆叉树的边数是 2a+b。该完全⼆叉树的前序序列为( )1.某⼆叉树共有 399 个结点,其中有 199 个度为 2 的结点,则该⼆叉树中的叶⼦结点数为( )

2026-01-06 17:40:03 1227 1

原创 【数据结构】实现二叉树

设⼆叉树的根结点所在层数为1,层序遍历就是从所在⼆叉树的根结点出发,⾸先访问第⼀层的树根结点,然后从左到右访问第2层上的结点,接着是第三层的结点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址, 其结构如下:。根结点的左⼦树和右⼦树分别⼜是由⼦树结点、⼦树结点的左⼦树、⼦树结点的右⼦树组成的,因此⼆叉树定义是递归式的,后序链式⼆叉树的操作中基本都是按照该概念实现的。

2026-01-06 17:38:45 1304

原创 【数据结构】栈和队列及相关算法题

栈:⼀种特殊的线性表,其只允许在固定的⼀端进⾏插⼊和删除元素操作。概念:只允许在⼀端进⾏插⼊数据操作,在另⼀端进⾏删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstInFirstOut)思路:如果是左括号就入栈,如果是右括号就取栈顶元素看是否匹配,若匹配成功,左括号出栈,继续查看下一个字符。出栈:把不为空的队列中前size-1个数据挪到另一个队列,再将最后一个数据出队列(此时相当于出栈)出队列:popST不为空直接出,否则将pushST中的数据先倒过去,再出数据。出栈:栈的删除操作叫做出栈。

2025-12-23 18:52:46 1871

空空如也

空空如也

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

TA关注的人

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