自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++11---可变模板参数、lambda和包装器

模板:普通函数模板(非可变参数)的参数个数是固定的,编译器会实例化出参数个数相同、但参数类型不同的多个函数。可变参数模板:可变参数模板函数通过参数包(Args...)支持任意数量的参数(包括 0 个)。编译器会根据传入的实参数量和类型,实例化出参数个数不同、且参数类型也可能不同的多个函数。普通模板函数的参数个数固定,类型可变,实例化出同参数个数、不同类型的函数;可变参数模板函数的参数个数和类型均可变,实例化出不同参数个数、且类型可能不同的函数。

2025-11-18 00:10:52 791

原创 优先算法---双指针和滑动窗口

1.双指针。

2025-11-17 11:51:58 891

原创 make/Makefile和进度条

出现这种情况的原因是printf里的内容会放入缓冲区中,而缓冲区是行刷新的,第一个printf结尾加了换行\n,因此刷新输出了,而第二个printf的内容里没换行\n,因此会一直在缓冲区之中,而随着程序结束,缓冲区再次被刷新,因此world被输出。如果依赖文件的Modify比目标文件的Modify晚,则说明依赖文件被修改,允许make更新目标文件。• 在找寻的过程中,如果出现错误,⽐如最后被依赖的⽂件找不到,那么make就会直接退出,并 报错,⽽对于所定义的命令的错误,或是编译不成功,make根本不理。

2025-11-07 21:05:37 788

原创 Linux基础开发工具----yum、vim和gcc/g++

• 在Linux下安装软件,⼀个通常的办法是下载到程序的源代码,并进⾏编译,得到可执⾏程序.• 但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安 装.• 软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系.

2025-11-06 23:50:30 879 1

原创 C++11----列表初始化、右值引用和移动语义

C++98中⼀般数组和结构体可以⽤{}进⾏初始化。

2025-11-05 21:42:57 551

原创 ⽤哈希表封装myunordered_map和myunordered_set

如果是以下这种情况,即只给HashTable传Hash参数,不给unordered_set和unordered_map传,这样导致哈希表封装unordered_set和unordered_map后只支持内置类型的key转换成size_t,对于自定义类型:Person、Date(日期类)等无法转换。• HashIterator实现HashTable的迭代器,主要有两个变量:_node和_ht,_node是指向哈希表中的节点的指针,_ht是哈希表(用于在operator++的时候寻找下一个桶)

2025-10-31 23:11:00 463

原创 哈希表实现

哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进⾏快速查找。

2025-10-30 23:19:26 890

原创 封装红黑树实现mymap和myset

1.begin()就是红黑树的最左节点。2.end()就是nullptra.如果右子树不为空,中序的下一个是右子树的最左(最小)节点。b.如果右子树为空,中序的下一个是祖先中孩子是父亲左边的那个节点。a.如果左子树不为空,中序的下一个是左子树的最右(最大)节点。b.如果左子树为空,中序的下一个是祖先中孩子是父亲右边的那个节点。c.如果节点为空,说明迭代器走到end()或者是空树,如果走到end(),end()--就是找红黑树中序的最后一个,即红黑树的最右节点。

2025-10-16 21:50:53 998

原创 【C++进阶】---- 红黑树实现

红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路 径⻓出2倍,因⽽是接近平衡的。

2025-10-08 23:17:12 559

原创 【C++进阶】----二叉树进阶算法题

前中后序遍历的思路是一样的1.访问一棵树时,先访问左路节点2.访问左路节点的右子树区别:记录节点的值的时机不提供a.前序遍历需要在将左路节点压入栈的时候记录值b.中序遍历需要在弹出左路节点的时候记录值c.后序遍历需要在确保左右子树访问过之后弹出左路节点时记录值相比于前序遍历和中序遍历,后序遍历访问左路节点的右子树时需要考虑右子树是否已经访问过了,所以后序遍历额外引入了一个perv指针用于记录上一个访问的节点。前、中、后序遍历的本质是根节点的访问时机差异见根就取(压栈时访问);左空再取。

2025-09-27 10:29:47 639

原创 【C++进阶】---- AVL树

1.AVL的概念•AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。•AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis是两个前苏联的科学家,他们在1962 年的论⽂《An algorithm for the organization of information》中发表了它。•。

2025-09-12 22:58:40 705

原创 Linux权限

所以就出现了所属者这个角色,有了所属者之后,如果李四说他想看这个文件,那你就将李四添加为该文件的所属者,并赋予所属者所需的权限,这样除了拥有者和所属者有所需权限,经由李四分享给其他人后,他们都是other,没有所需权限就无法对文件进行所需操作了。原因就是在Centos下,文件在确定用户角色的时候,确认的顺序是按拥有者,所属者,other这个顺序进行确认的,这里确定了wsj是拥有者的角色,那其权限就是---,一旦角色确认下来后,权限也就确定下来了,不会因为权限被拒绝后再去确认用户是不是其他角色。

2025-09-10 13:02:12 872

原创 【C++进阶】---- map和set的使用

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持 ⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的 内存是从空间配置器申请的。⼀般情况下,我们都不需要传后两个模版参数。map底层是⽤红⿊树实 现,增删查改效率是OlogN,迭代器遍历是⾛的中序,所以是按key有序顺序遍历的。template < class Key, // map::key_type key类型。

2025-09-09 15:43:07 1045

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

• ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等值,multimap/multiset⽀持插⼊相等值下图中,左侧的是二叉搜索树,右侧的不是二叉搜索树。

2025-07-28 22:39:51 814

原创 【C++进阶】---- 多态

多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。

2025-07-14 20:17:32 1056

原创 Linux基本指令(下)

在Linux系统中一切皆是文件,我们新建的文件、键盘、显示器等皆是文件,所以使用scanf/cin获取键盘输入信息和printf/cout向屏幕上输出信息,这一切的本质其实就是文件操作,而文件操作文件必须被先打开,所以这些设备文件在访问之前,也必须被打开。

2025-07-03 19:18:31 799

原创 Linux基本指令(上)

• -F在每个⽂件名后附上⼀个字符以说明该⽂件的类型,“*”表⽰可执⾏的普通⽂件;“/”表⽰⽬录;“@”表⽰符号链接;“|”表⽰FIFOs;“=”表⽰套接字(sockets)。(⽬录类型识别)• -r对⽬录反向排序• -t以时间排序• -s在l⽂件名后输出该⽂件的⼤⼩。(⼤⼩排序,如何找到⽬录下最⼤的⽂件)• -R列出所有⼦⽬录下的⽂件。(递归)• -1⼀⾏只输出⼀个⽂件。

2025-06-30 19:03:16 1034

原创 使用Xshell学习Linux的一些基本操作

我们可以去阿里、京东、腾讯那去买一个轻量级应用服务器,然后下载Xshell去登录连接我们的Linux,Xshell本质是一个终端软件,和windows的cmd差不多,我们买完服务器后,去实例里找我们的公网IP,然后就可以去Xshell进行登录然后输入密码即可登录账号。

2025-06-29 15:40:01 473

原创 【C++进阶】--- 继承

下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类。

2025-06-28 21:44:47 1084

原创 【C++初阶】--- 模板进阶

• 模板参数分类类型形参与非类型形参。• 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。• 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。注意:array• 在 C++ 标准库中,std::array 是一个固定大小的容器,它可以存储一组相同类型的元素。• array开辟空间的效率比vector要高一些,因为array开的是静态数组,是在栈上开的,而vector开的是动态数组,是在堆上开的,栈上

2025-04-29 22:53:41 732 3

原创 【C++初阶】--- deque容器和stack、queue、priority_queue三个容器适配器的模拟实现

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要移元素;与list比较,空间利用率比较高。

2025-04-23 15:44:13 930 2

原创 【C++初阶】--- list容器功能模拟实现

在 C++ 标准模板库(STL)中,std::list 是一个非常有用的容器,它是双向链表的实现std::list 是一种序列式容器,它允许在序列内的任意位置进行高效的插入和删除操作。与数组和 std::vector 不同,

2025-04-17 21:59:33 1122 3

原创 【C++初阶】--- vector容器功能模拟实现

在 C++ 里,std::vector 是标准模板库(STL)提供的一个非常实用的容器类,它可以看作是动态数组。

2025-04-10 19:38:00 989

原创 【C++初阶】--- string类模拟实现

成员函数主要是_str、_size、_capacity这三个。npos是size_t 的最大值,用于当作后续成员函数的参数的缺省值。

2025-04-07 22:17:45 930 1

原创 【C++初阶】--- string类

std::string 类是 C++ 标准库中用于处理和操作字符串的一个类,它定义在 头文件中。相较于 C 语言里以空字符 ‘\0’ 结尾的字符数组(C 风格字符串),std::string 类提供了更便捷、安全且强大的字符串处理功能。

2025-04-02 21:52:41 706 2

原创 【C++初阶】----模板初阶

class 类模板名// 类内成员定义。

2025-03-30 10:12:14 483 3

原创 【C++初阶】--- 内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。class Apublic://默认构造:_a1(a1),_a2(a2)//拷贝构造//析构~A()//赋值运算符重载private:int _a1;int _a2;int main()//拷贝构造//匿名对象//隐式类型转换delete p1;delete p2;return 0;

2025-03-30 08:37:56 1134 3

原创 【C++初阶】---类和对象(下)

•之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后⾯跟⼀个放在括号中的初始值或表达式。• 每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地⽅。• 引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。• C++11⽀持在成员变量声明的位置给缺省值,这

2025-03-29 10:05:03 984 1

原创 【C++初阶】--- 类与对象(中)

默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我们不写的情况下编译器会默认⽣成以下6个默认成员函数,我们主要需要掌握前4个,后两个了解以下即可,默认成员函数很重要,也⽐较复杂,我们要从两个⽅⾯去学习:• 第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。• 第⼆:编译器默认⽣成的函数不满⾜我们的需求,我们需要⾃⼰实现,那么如何⾃⼰实现?构造函数的主要任务是对象实例化时初始化对象。构造函数的本质是要代替我们之前Stack和Data类中写的Ini

2025-03-25 20:07:02 671 1

原创 【C++初阶】---类和对象(上)

类体中内容称为类的成员:类中的变量称为类的属性或。

2025-03-23 19:31:56 904 1

原创 【数据结构初阶&&八大排序】---冒泡、选择、插入、希尔、堆排、快排、归并、计数

通过以上代码我们会发现在最坏的情况下冒泡排序的执行次数是(n-1)+(n-2)+…+2+1,总共也就是n^2/2-n/2,所以时间复杂度是O(N*N),我们这里也并没有额外开很多空间,所以空间复杂度是O(1)最好的情况也就是待排序序列已经是有序序列了,此时我们循环执行的此时仅为n-1次,因此冒泡排序的时间复杂度在最好的情况下是O(N),不过这种情况概率极低。

2025-03-22 12:31:25 1270

原创 【 C++入门基础】---- 学习类与对象前的一些准备工作

• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。//wsj是我随意为变量空间取的名字//命名空间中可以定义变量/函数/类型int rand;int* a;int top;• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下⾯的rand不再冲突了。int rand;//不再报错int* a;int top;

2025-03-19 22:44:23 911

原创 【数据结构初阶】----二叉树基本功能的实现

二叉树的节点包括一个值,和指向左右孩子的两个同类型指针//二叉树节点的结构}BTNode;

2025-03-11 20:51:01 857

原创 【C语言&&数据结构初阶】---基于单链表在控制台上实现贪吃蛇小游戏

表⽰⼀个字符在控制台屏幕幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。

2025-03-09 18:51:51 909 2

原创 【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题

对于堆我们是采用顺序表进行存储,因此定义了一个指向数组的指针a和存储数据个数和申请的空间大小的两个变量。int size;//数据个数//空间大小}HP;

2025-03-08 19:18:10 899

原创 【数据结构初阶】----栈和队列的基础功能的实现

栈的结构中包括一个指针a指向数据类型是STDataType的数组、一个记录数据个数的top,以及我们动态申请的空间大小capacity//元素类型int top;//栈顶的下一个元素//空间大小}ST;QNode结构体是单链表的节点,Queue结构体中存放的是链表的头指针和尾指针以及链表的长度size//队列:先进先出//以链表为基础实现}QNode;//因为后续函数要传的形参包括头指针和尾指针,二者要传的还是二级指针//对于多个参数,我们直接定义一个结构体方便后续使用。

2025-03-06 15:58:26 1072

原创 【数据结构初阶】---时间复杂度和空间复杂度了解及几道相关OJ题

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏,一般是从和两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

2025-03-02 19:23:53 798

原创 【C语言】---双向链表的实现

哨兵位”就是双向链表的头节点,这个节点和其余节点一样有指向下一个节点的next和直线前一个节点的prev,“哨兵位”初始化的时候next和prev都指向自己,从而形成循环。包括节点值,指向下一个节点地址的指针next和指向前一个节点地址的指针prev。

2025-03-01 20:46:04 437

原创 【C语言】---单链表的实现

结构中有两个元素,一个是节点的值,一个是直线下一个节点的地址的指针next。

2025-03-01 20:11:14 270

原创 【C语言】---- 动态顺序表的实现

需要注意的是:我们动态分配的空间需要先使用另一个指针变量先进行接受,确认成功申请到空间后我们再把申请到的空间给顺序表,不然如果申请失败的话会导致原本在顺序表的数据丢失。首先我们需要判断地址的有效性,确认有效后我们再把顺序表存放数据时申请的动态内存释放,并把指针置空,有效数据个数和空间大小赋值为0。当然,因为后续的多个功能也需要判断顺序表的功能够不够,因此我们需要单独为其写一个函数,方便后续使用和简短整体代码。(每次空间不够用再为其分配空间时,分配的空间是整体的2倍,这边涉及的是概率论,不仔细展开讲解)

2025-02-16 21:09:55 1151

空空如也

空空如也

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

TA关注的人

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