- 博客(55)
- 收藏
- 关注
原创 C++ String
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。
2024-11-03 21:20:27 515
原创 C++ STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的 组件库,而且是一个包罗数据结构与算法的软件框架。STL主要包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Function Objects)四个部分。这些组件可以相互协作,提供高效、灵活的数据处理功能。
2024-11-01 21:09:26 473
原创 C++ 模版(初阶)
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
2024-11-01 20:39:53 301
原创 C++类和对象(下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;const修饰的变量只有一次赋值初始化的机会,就是在它定义的时候,必须在定义的时候初始化,之后不能改变通俗的讲,声明是告诉我们有这个东西,定义是木已成舟,已经开空间了。声明的顺序也就是在内存当中从上到下存放的顺序。
2024-10-28 14:43:28 605
原创 C++类和对象(中)
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最 后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后⾯再讲解。默认成员函数很重要,也⽐较复杂.我们要从两个⽅⾯ 去学习:• 第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。
2024-10-23 17:17:31 799
原创 C++ 类和对象(上)
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。
2024-10-22 18:27:08 732
原创 归并排序-加餐
我之前讲的一些常见的排序都是内排序,他们的排序思想适应的是数据在内存中,支持下标的随机访问。归并排序的思想不需要随机访问数据,只需要依次按序列读取数据,所以归并排序既是一个内排序,也是一个外排序。
2024-10-17 21:02:14 312
原创 快速排序-加餐
决定快排性能的关键点是每次单趟排序后,key对数组的分割,如果每次选的key基本都二分居中,那么快排的递归树就是一棵均匀的满二叉树,性能达到最佳。但是在实践中虽然不可能每次都是二分居中,但是性能也是可控的,但是如果每次选到最小或者最大值,就会划分成0和N-1个子问题,时间复杂度就会变成O(N^2),就比如数组是有序的就会出现这种情况。在之前相关的章节,我们用了三数取中随机选取key和小区间优化来解决这个问题,虽然解决了大多数问题,但是还是有一些场景没能解决,就比如数组中有大量重复的数据。
2024-10-16 19:48:48 578
原创 数据结构-排序2
1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序2. 时间复杂度:O(N*logN)3. 空间复杂度:O(logN)4. 稳定性:不稳定1. 归并的缺点在于需要O(N)的空间复杂度,思考更多的是解决在磁盘中的外排序问题。2. 时间复杂度:O(N*logN)3. 空间复杂度:O(N)4. 稳定性:稳定。
2024-10-15 09:36:09 966
原创 数据结构-排序1
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次 序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排 序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。
2024-10-08 21:37:58 1024
原创 二叉树的遍历
先简单手搓一个二叉树,快速进入本次的操作学习。}BTNode;如图所示,一棵二叉树,上述代码并不是创建二叉树的方式,真正创建方式后序详解重点讲解。再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是:1. 空树2. 非空:根结点,根结点的左子树、根结点的右子树组成的。
2024-10-07 11:24:31 867
原创 二叉树--堆
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结 构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统 虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。
2024-10-04 20:32:32 1082
原创 树--二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限节点组成的一个具有层次关系的集合,它的外形像像一棵倒挂的树,根向上,叶子是向下的,所以我们称之为树。树有一个特殊节点,就是它的根节点,它的根节点是没有前驱节点的。除根结点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。所以,树是递归定义的。树的数据结构中,它的子树之间是不能有交集的,不然就破坏了树的结构,不是树了。
2024-10-03 11:25:27 663
原创 栈和队列的相互实现(C)
栈后进先出,队列先进先出,这里我们要用两个队列实现栈。LeetCode 225.用队列实现栈 (C语言,要自己造轮子,造个栈的结构出来)例如,队列先进数据是1234,然后出数据遵循栈的后进先出就是4321.
2024-10-02 17:19:06 375
原创 数据结构-队列
队列:是一种特殊的线性表,只允许在一端进行数据的插入操作,在另一端进行数据的删除操作。队列的特性是队里的元素都遵循先进先出FIFO(First In First Out)的原则。入队列:进行数据插入的一端被称为队尾。出队列:进行数据删除的一端被称为队头。
2024-10-01 11:07:33 434
原创 数据结构-栈
栈:栈是一种特殊的线性表,它只允许在固定的一端进行元素的插入和删除操作。进行数据操作的一端我们称之为栈顶,那另一端被称为栈底。栈的元素都遵循后进先出LIFO (Last In First Out)的原则。压栈:是指栈的插入数据的操作,也叫进栈和入栈。出栈:是指栈的删除数据的操作。压栈和出栈的数据操作都是在栈顶完成的。
2024-10-01 09:58:42 609
原创 双链表专题
这里的双向链表我们称之为带头双向循环链表。内置结构:以整形为例,包括存储的数据,后继指针和前驱指针int data;int* next;int* prev;这里的带头是指具有哨兵位节点,哨兵位节点不存储任何有效元素,相当于“”放哨的”。双向链表的增删查改不能改变哨兵位,哨兵位存在的意义:避免循环链表出现次循环。
2024-09-17 14:16:23 212
原创 数据结构 1
算法(Algorithm)就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为 输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。3.数据结构和算法的书籍资料学习完数据结构知识,可以去看《剑指offer》和《程序员代码面试指南》。4.算法的效率衡量一个算法的好坏,要从它的程序的时间复杂度和空间复杂度两方面来分析。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。5.时间复杂度。
2024-09-14 12:37:02 640
原创 C++基础知识(2)
• ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
2024-07-27 18:40:28 296
原创 C++ 基础知识(1)
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-07-09 20:25:34 850
原创 C语言的内存函数
• 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。• 这个函数在遇到 '\0' 的时候并不会停下来。• 如果source和destination有任何的重叠,复制的结果都是未定义的。int i = 0;for (i = 0;i < 10;} return 0;对于重叠的内存,交给memmove来处理。memcpy函数的模拟实现:/**/
2024-06-22 21:20:16 1153
原创 函数的使用和模拟实现
• 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。• 参数指向的字符串必须要以 '\0' 结束。• 注意函数的返回值为size_t,是⽆符号的( 易错 )• strlen的使⽤需要包含头⽂件 • 学会strlen函数的模拟实现strlen的模拟实现://计数器⽅式⽅式1:str++;⽅式2://不能创建临时变量计数器⽅式3://指针-指针的⽅式while(*p!return p-s;
2024-06-18 20:16:12 916
原创 看看字符函数
在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。
2024-06-07 20:00:30 432
原创 认识认识指针(4)
回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式 传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函 数的功能。
2024-05-26 20:56:04 845
原创 Ubuntu解决开机黑屏
图形驱动程序可能是导致黑屏问题的原因之一。使用命令行或恢复模式,尝试更新或重新安装图形驱动程序。在启动过程中按下Shift键,以进入Ubuntu的恢复模式。在恢复模式下,你可以尝试修复损坏的系统文件或重新配置图形驱动程序。首先,确保所有硬件设备(如显示器、键盘和鼠标)都正确连接并且正常工作.尝试重新插拔它们,确保它们连接牢固且没有松动。按下电源按钮,将计算机完全关机,然后再次启动。可以考虑重新安装Ubuntu操作系统,确保在重新安装前备份重要的数据。确保显示器正确连接到计算机,并且显示器输入源正确设置。
2024-05-26 20:42:47 5354 1
原创 认识认识指针(3)
在指针的类型中我们知道有⼀种指针类型为字符指针 char*;*pc = 'w';return 0;return 0;这⾥str3和str4指向的是⼀个同⼀个常量字符串。C/C++会把常量字符串存储到单独的⼀个内存区域, 当⼏个指针指向同⼀个字符串的时候,他们实际会指向同⼀块内存。但是⽤相同的常量字符串去初始 化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。
2024-05-25 21:34:15 887
原创 认识认识指针(2)
数组名和数组⾸元素的地址打印出的结果⼀模⼀样,数组名就是数组⾸元素(第⼀个元素)的地址。其实数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:• sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩, 单位是字节• &数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素 的地址是有区别的) 除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。
2024-05-25 19:56:00 797
原创 初识指针(1)
把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。计算机中常⻅的单位(补充): ⼀个⽐特位可以存储⼀个2进制的位1或者0。其中,每个内存单元,相当于⼀个学⽣宿舍,⼀ 个⼈字节空间⾥⾯能放8个⽐特位,就好⽐同学们 住的⼋⼈间,每个⼈是⼀个⽐特位。每个内存单元也都有⼀个编号(这个编号就相当 于宿舍房间的⻔牌号),有了这个内存单元的编 号,CPU就可以快速找到⼀个内存空间。⽣活中我们把⻔牌号也叫地址,在计算机中我们 把内存单元的编号也称为地址。C语⾔中给地址起 了新的名字叫:指针。
2024-05-24 10:40:50 1139
原创 介绍一操作符
• 算术操作符: + 、- 、* 、/ 、%• 移位操作符:>• 位操作符:& | ^ `• 赋值操作符:= 、+= 、 -= 、 *= 、 /= 、%= 、、>>= 、&= 、|= 、^=• 单⽬操作符:!、++、--、&、*、+、-、~ 、sizeof、(类型)• 关系操作符:> 、>= 、< 、、 == 、!• 逻辑操作符: && 、||• 条件操作符:?• 逗号表达式: ,• 下标引⽤: []• 函数调⽤: ()• 结构成员访问: . 、->
2024-05-16 20:54:59 980
原创 VS调用技术
当我们发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)的意思。
2024-05-13 20:19:00 534
原创 认识认识函数
其实⾃定义函数和库函数是⼀样的,形式如下:ret_type fun_name(形式参数) { }• ret_type 是函数返回类型• fun_name 是函数名• 括号中放的是形式参数• {}括起来的是函数体⼀般我们在使⽤函数的时候,直接将函数写出来就使⽤了。像上述判断闰年的函数定义和函数的调用,定义声明一般要在调用之前。就是函数调⽤之前先声明⼀下is_leap_year这个函数,声明函数只要交代清 楚:函数名,函数的返回类型和函数的参数。
2024-05-12 20:06:53 1407
原创 Ubuntu c++ 编译中的问题
1.编译中找不到文件或目录1.1要在C/C++配置中包含相关路径1.2要在CMakeLists.txt中添加依赖1.3保存重新编译colcon build
2024-05-10 20:32:37 316
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人