自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2026-09-08 20:00:10 13839 20

原创 【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 3594

原创 【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 2916

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

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

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

原创 【C++进阶】手写哈希表:模拟实现 unordered_map 与 unordered_set

但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为非标准的容器出现的,非标准是指非C++标准规定必须实现的,源代码在hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中。这里的难点是反而是结构设计的问题,参考上面的源码,我们可以看到iterator中除了有结点的指针,还有哈希表对象的指针,这样当前桶走完了,要计算下一个桶就相对容易多了,用key值计算出当前桶位置,依次往后找下一个不为空的桶即可。

2026-09-16 16:06:21 162

原创 【C++】哈希表

哈希表通过哈希函数将关键字映射到数组下标,实现快速存取。直接定址法简单高效但受限于关键字范围;除法散列法最常用,但需注意模数选择。冲突不可避免,开放定址法(线性探测、二次探测等)将所有元素存储在表中,而链地址法使用链表处理冲突,更灵活且负载因子可大于 1。代码实现中需要处理扩容、状态标记、键转换等问题。掌握这些基础,就能更好地理解和使用 C++ 中的 unordered 系列容器。

2026-09-15 22:23:49 324

原创 【C++】unordered_set和unordered_multiset

• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key支持转换为整形,如果不支持或者想按自己的需求走可以自行实现支持将Key转成整形的仿函数传给第二个模板参数• unordered_set默认要求Key支持比较相等,如果不支持或者想按自己的需求走可以自行实现支持将Key比较相等的仿函数传给第三个模板参数。

2026-09-15 18:59:41 82

原创 【C++进阶】封装

SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等几个头文件中。通过下图对框架的分析,我们可以看到源码中rb_tree用了一个巧妙的实现,rb_tree是实现key的搜索场景,还是key/value的搜索场景不是直接写死的,而是由第二个模板参数Value决定_rb_tree_node中存储的数据类型。

2026-09-09 16:16:16 148

原创 【C++进阶】红黑树详解:从原理到C++实现

因为p和u都是红色,g是黑色,把p和u变黑,两边子树路径各增加一个黑色结点,g再变红,相当于保持g所在子树的黑色结点的数量不变,同时解决了c和p连续红色结点的问题,需要继续往上更新是因为,g是红色,如果g的父亲还是红色,那么就还需要继续处理;如果g就是整棵树的根,再把g变回黑色。图2/图3/图4分别展示了hb。c为红,p为红,g为黑,u不存在或者u存在且为黑,u不存在,则c一定是新增结点,u存在且为黑,则c一定不是新增,c之前是黑色的,是在c的子树中插入,符合情况1,变色将c从黑色变成红色,更新上来的。

2026-09-09 16:14:18 238

原创 【C++进阶加餐】加餐来啦!二叉树进阶算法题

思路2:依旧中序遍历搜索二叉树,遍历顺序是有序的,遍历过程中修改左指针为前驱和右指针为后继指针。记录一个 cur 和 prev , cur 为当前中序遍历到的结点, prev 为上一个中序遍历的结点, cur -> left 指向 prev , cur -> right 无法指向中序下一个,因为不知道中序下一个是谁,但是 prev -> right 指向 cur;也就是说每个结点的左是在中遍历到当前结点时修改指向前驱的,但是当前结点的右,是在遍历到下一个节点时,修改指向后继的。

2026-09-08 20:11:48 420

原创 【C++进阶】深入理解AVL树:从平衡因子到四种旋转的C++实现详解

AVL树是最先发明的自平衡二叉查找树。一棵AVL树或者是空树,或者是具备下列性质的二叉搜索树:它的左右子树都是AVL树,且左右子树的高度差的绝对值不超过1。AVL树是一棵高度平衡搜索二叉树,通过控制高度差去控制平衡。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,两位前苏联科学家在1962年的论文《An algorithm for the organization of information》中发表了它。

2026-09-03 16:46:18 323

原创 【C++进阶】 STL set 与 multiset 容器详解:从入门到实战应用

set的声明如下,T就是set底层关键字的类型set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模板参数。set底层是用红黑树实现,增删查效率是 O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。

2026-09-03 16:43:14 290

原创 【C++进阶】面试官常考的关于多态一些常见问题!!!

多态(Polymorphism)是面向对象编程的三大特性之一,指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。简而言之,即"一个接口,多种实现"。其核心在于通过基类的指针或引用来调用派生类的虚函数,在运行时决定具体执行哪个函数,从而实现接口与实现的分离。详细定义、分类(编译时多态与运行时多态)及示例,请参考链接内容。重载(Overload):发生在同一作用域内(如一个类中),函数名相同但参数列表(类型、顺序、数量)不同。编译器在编译期根据参数决定调用哪个函数,属于静态多态。

2026-06-04 11:52:14 883

原创 【C++进阶】map/multimap 容器详解:从基础使用到底层实现与高频面试题

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模板参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模板参数。map底层是用红黑树实现,增删查改效率是O(logN),迭代器遍历是走的中序,所以是按key有序顺序遍历的。map底层的红黑树节点中的数据,使用pair<Key, T>存储键值对数据。T1 first;T2 second;{}

2026-06-04 11:52:01 408

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

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

2026-06-02 11:03:55 48

原创 【C++进阶】二叉搜索树

支持修改 value,但不支持修改 key。二叉搜索树中可以支持插入相等的值,也可以不支持插入相等的值,具体看使用场景定义,后续我们学习 map/set/multimap/multiset 系列容器底层就是二叉搜索树,其中 map/set 不支持插入相等值,multimap/multiset 支持插入相等值。如果支持插入相等的值,插入值跟当前结点相等的值可以往右走,也可以往左走,找到空位置,插入新结点。树不空,按二叉搜索树性质,插入值比当前结点大往右走,插入值比当前结点小往左走,找到空位置,插入新结点。

2026-05-28 08:00:00 305

原创 【C++进阶】多态,坑很多,面试常考!!!

多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person,Person对象买票全价,Student对象优惠买票。实现多态还有两个必须重要条件:• 必须是基类的指针或者引⽤调⽤虚函数• 被调⽤的函数必须是虚函数,并且完成了虚函数重写/覆盖。public:virtual void sound() { // 必须是虚函数cout << "动物发声" << endl;public:void sound() override { // 完成了重写(

2026-05-27 20:36:42 793

原创 【C++进阶】深入了解继承

不过也不太那么绝对,类之间的关系就适合继承(is-a)那就用继承,另外要实现多态,也必须要继承。支持多继承就一定会有菱形继承,像Java就直接不支持多继承,规避掉了这里的问题,所以实践中我们也是不建议设计出菱形继承这样的模型的。多继承:一个派生类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型是,先继承的基类在前面,后面继承的基类在后面,派生类成员在放到最后面。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂,性能也会有一些损失,所以最好。

2026-05-27 20:36:39 847

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

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

2026-05-26 13:39:25 538

原创 【Linux】shell与权限

2026-05-26 13:39:04 50

原创 【Linux】基础指令

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

2026-05-24 22:56:20 518

原创 【Linux】自存Linux历史

2026-05-18 21:48:02 53

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

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

2026-05-18 21:45:43 1101

原创 【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 213

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

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

2026-05-10 15:52:50 489

原创 【C++】queue(二)

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

2026-05-10 15:52:41 190

原创 【C++】stack(一)

stack的文档介绍。

2026-05-09 17:12:02 40

原创 【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 86

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

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

2026-05-07 12:53:53 182

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

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

2026-05-06 23:44:35 347

原创 【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 632 1

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

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

2026-05-05 20:40:04 524

原创 【C++】vector介绍

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

2026-05-05 20:39:40 206

原创 【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 904 1

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

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

2026-04-29 22:50:50 408

原创 【C++】STL简介

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

2026-04-28 20:09:54 353

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

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

2026-04-28 20:09:38 63

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

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

2026-04-27 16:59:25 1272

原创 【C++】模板初阶

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

2026-04-27 16:59:07 906

原创 【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 1608

空空如也

空空如也

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

TA关注的人

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