- 博客(45)
- 收藏
- 关注
原创 类和对象(1)--《Hello C++ Wrold!》(3)--(C/C++)
本文介绍了面向对象编程的基础知识,包括面向过程与面向对象的区别、类的引入与定义、访问限定符及封装、类的作用域以及类的实例化。面向过程关注问题解决的步骤,而面向对象则关注对象间的交互。类可以看作包含成员函数的结构体,C++中常用class定义类。类的成员包括成员变量和成员函数,访问限定符(public、protected、private)用于控制成员的访问权限,封装则是对类的管理,确保用户只能访问允许的部分。类的作用域涉及局部域、全局域、命名空间域和类域,编译器按顺序搜索变量。类的实例化是为类分配空间的过程,
2025-05-12 07:00:00
1785
48
原创 C++入门(下)--《Hello C++ World!》(2)(C/C++)
这期会把上一期C++入门没有讲完的引用,内联函数跟nullptr给讲完,下期将会讲解类和对象。
2025-05-08 07:00:00
1730
51
原创 C++入门(上)--《Hello C++ World!》(1)(C/C++)
C++不是C#C++兼容大部分C的东西,但不是完全(98%的样子,除非遇到了不兼容的,那就记一下,不然就认为自己在C里面写的那些可以写到C++里(不兼容编译器也会提醒))C++标准库的头文件都没有.h,这些都需要std这个命名空间才能用;C的库在CPP上也能用(不会用一般),但是不需要std;比如cstdio要std stdio.h就不用学完C++的继承和多态之后建议看一下《Effective C++》,然后C++ Primer可以当做是一本语法字典,
2025-05-05 07:00:00
2171
60
原创 排序--数据结构初阶(4)(C/C++)
这是数据结构初阶的最后一期,虽然来说在C++的库函数里面有sort函数可以代替这里所有的方法,并且时间复杂度也是优于他们的,但是sort函数是由他们写出来的,因此,还是是有必要学习一下的。
2025-04-28 07:00:00
3697
81
原创 顺序表和链表,时间和空间复杂度--数据结构初阶(1)(C/C++)
这期的话会给大家讲解复杂度,顺序表和链表的一些知识和习题部分(重点是习题部分,因为这几个理念都比较简单)
2025-04-17 09:31:45
2610
82
原创 基础算法篇(5)(蓝桥杯常考点)—动态规划(C/C++)
在竞赛中,如果遇到动态规划的题目,只要不是经典题型,那么大概率就是以压轴题的形式出现用动态规划解决问题的步骤:(递推形式)1.定义状态表示:根据经验+需要的意义,赋予dp数组相应的含义(主要还是看需要记什么)2.推导状态转移方程:在dp表中分析,当前格子如何通过其余格子推导出来的3.初始化:将显而易见的以及边界情况下的位置填上值,来让后续填表的结果是正确的4.确定填表顺序:根据状态转移方程,确定按照什么顺序来填表5.找出最终结果:在表中找出需要的最终结果。
2025-04-14 07:00:00
15914
77
原创 基础算法篇(4)(蓝桥杯常考点)—数据结构(进阶)
这期将会讲到基础算法篇里面的数据结构(进阶),主要包括单调栈,单调队列,并查集,扩展域并查集,带权并查集,字符串哈希,Trie树。
2025-04-07 03:00:00
3311
70
原创 基础算法篇(2)(蓝桥杯常考点)—搜索
搜索搜索也叫做暴搜,在未优化前就是通过穷举所有情况来找到最优解搜索一般分为深度优先搜索和宽度优先搜索一般用到的优化方法是:回溯和剪枝回溯:在搜索过程中,遇到走不通或者走到底的情况时,就回头 剪枝:在搜索过程中,剪掉重复出现或者不是最优解的分支 用的数不重复的用排列组合思想去分析题(像eg:高中的C和A类型的题)
2025-03-24 09:09:03
3530
10
原创 算法基础篇(1)(蓝桥杯常考点)—基础算法
注意事项:1.多组测试时,一定要考虑需不需要清空数据一般是能覆盖的话(没覆盖的部分不用就行了)不清空或者还能用就不清空(权衡时间复杂度,清空是用时间换空间)2.int类型的无穷大可以搞为 int inf = 0x3f3f3f3f。
2025-03-17 08:09:25
6809
17
原创 C++(蓝桥杯常考点)
double在各编译器中的大小不同,因为一般用sizeof(double),浮点数自己一般用double类型的。易忘:int arr[][5]={{1,2},{3,4},{5,6}};字符数组一般用string替代,基本不用字符数组(string结尾不用'/0')循环一般用for,除非需要n次循环,喜欢用while(n--){ }int是2的31次方-1或者10的9次方(大于了就会超范围)switch的一个易忘用法:(switch的格式也容易忘)定义常量一般用const,定义的变量名一般用大写。
2025-03-03 07:43:11
4743
5
原创 哈希表和unordered_set和unordered_map
解决方法:给数组扩大为原来的两倍,然后取模的那个模数取离哈希表大小两倍最近的那个素数。面对哈希冲突时,需要设计出优秀的哈希函数并且处理哈希冲突,而不是去想着消除哈希冲突。如果数据存的太密集的话,用线性探测法就要找很久。如果数据冲突的太多的话,一个链表就会很长很长。解决方法:不用链表来挂,用红黑树来挂。
2025-02-24 09:23:26
1946
3
原创 红黑树和set与map
区分递增和严格递增(在写代码时不一样,数学中一般递增指的是严格递增)创建二叉搜索树不是为了排序,而是为了快速插入、删除以及查找元素。场景二:找出一堆字符串中,某一个字符串出现的次数--用map。场景一:判断一堆字符串中,某一个字符是否出现过--用set。INF这个变量名一般表示无穷大的意思。根节点未说明时,一般指的是那一个。
2025-02-23 11:13:21
375
2
原创 二叉树(数据结构)
像二叉树这样向一个地方走完了要回溯到之前去走其他路的采用递归很好。按照先序遍历的方法去手算处理这个二叉树。二叉树也是用过递归定义的结构。先序遍历又称前序遍历。
2025-02-20 18:46:24
1201
1
原创 树(数据结构·)
当一条路走完,走到不能再走的时候,那就回去(回到又可以走的地方,不一定是根结点),继续去找别的路。所谓的DFS,也就是说每次都尝试向更深的节点走,也就是一条路走到黑。里面没有结点时,称之为空树。树型结构是一对多的形式。
2025-02-19 19:18:31
484
5
原创 顺序表和vector
pair的重命名方式一般是采用eg:两个都是int类型的话就是PII,(I为int的首字母的大写)这里的前驱和后继的关系是针对于表中相邻元素而言的。线性表相关术语:表头、表尾、前驱、后继、空表。存在迭代器的容器才可以使用范围for。线性表中一个元素没有则叫空集。
2025-02-15 14:59:23
347
1
原创 [加餐]指针和动态内存管理 以及【加餐】使⽤指针实现链表
编译器在每次编译代码时,给eg:变量分配的空间位置不一定跟上次一样。X64环境下的地址较长 X86环境下的地址较短。默认情况下,堆区的空间都需要手动申请和释放。随着数组下标的增长,地址是由低到高变化的。每个字节都有其对应的地址。地址之间也可以比大小。
2025-02-05 11:21:40
463
1
原创 结构体和类
在C++中,当你在一个类的成员函数中访问该类的成员变量时,可以直接使用成员变量的名称(加上eg:Stu.也没问题),而不需要通过结构体或类的实例来访问。使用引用作为运算符重载的参数可以避免拷贝、支持修改操作数、操作非拷贝对象,并保持代码一致性,返回引用则直接操作原对象,效率更高。仅用于定义结构体,是一种纯粹的数据集合,没有成员函数、访问控制等面向对象的特性。C++中struct既可以是结构体,也可以是类,所以用法更多。<<输出运算符能够直接打印C++已有的类型的变量,自己的自定义的类型不行。
2025-02-04 16:35:45
710
1
原创 位运算和操作符属性
如果if碰到其他进制的话,其他进制中有一个1或者即以上都为真(其实和十进制一样)eg:2进制转换为32进制则''每5个2进制位转化成一个32进制位...''除了课件中提到的那几种应用,其他时候一般先不考虑用这个原反补码。int类型的原码,反码,补码都是32位(因为占4个比特位)有符号整数的补码变成原码先看符号位来判断用哪种方法变。关于优先级:(优先级可以不用记,用括号来绑定就行了)移位操作符移动的是储存在内存中的补码的二进制序列。正数或者无符号数左移一位有乘二的效果。正数右移一位有除二的效果。
2025-02-03 17:20:31
626
原创 函数与递归
能用循环时用循环不用迭代,除非用循环很复杂和明显是递归问题的才考虑用迭代,但要考虑迭代时会不会出现栈溢出。函数重载解决了大致功能相同,参数不同的函数名字不同而不好记的问题。reverse的最后面那个参数要指向想翻转的末尾序列的后一位。重载函数->编译器会根据传递的参数来自动推导应该用哪个函数。函数对全局变量做出的改变还是不会随着函数结束而消失的。声明或者定义应该在使用之前(不单单针对于函数)函数声明在main函数里面也是可以的。引用变量和引用实体的变化是一样的。传址调用比传值调用效率高。
2025-02-02 18:15:20
636
1
原创 C_C++输入输出
字典序是根据字符在字母表中的顺序来比较和排列字符串的(字典序的大小就是字符串的大小)1.一次循环决定打印几行,一次循环决定打印几项。整数和char类型的单字符可以比较大小。cin是>> cout是<<如果输出整数的话 000要整成0。
2025-02-01 17:31:29
385
1
原创 string和数据结构、算法与STL
string& 是 C++ 中的引用类型,表示对字符串( string )的引用.C语言中一整个字符串是用字符数组才能表示出来,不能char s = "abcd";用string类型的字符串来存储字符串的话可以不关心空间,因为它会自动扩容。C和C++中的内置类型(比如:long)一定满足所有同类型的关系运算。getline在C语言和C++中的用法不一样,头文件也不一样。一般可以带的出去的才是输出型参数,比如:指针。遍历字符串可以用:下标,范围for,迭代器。而像string这种就不一定。
2025-01-27 21:41:53
908
3
原创 数组和单链表专题
栈区的空间很有限,静态区的空间大些,一般在静态区去申请较大的空间考虑特例能不能归并到一起也很重要在二维数组中,基于范围的 for 循环直接遍历的是行,而不是单个元素对于一个 int arr[3][4] 的二维数组, memset 会首先填充 arr[0][0] 到 arr[0][3]如果将数组定义为全局变量,其元素会被默认初始化为0设置变量名时,一般取单词的前三个字母作为变量名地址是常量整型和字符型变量在比较大小的时候,字符型变量会被提升为整型(对应的ASCII值)
2025-01-25 21:45:16
342
1
原创 条件判断与循环
在scanf中:4表示 如果输入的字符少于4个, scanf 会停止读取并返回。如果输入的字符多于4个, scanf 只会读取前4个字符,并将它们转换为整数。在printf中:4表示 如果整数的位数小于4位,它将在前面填充空格以占据4个字符的宽度。如果整数的位数大于或等于4位,它将按实际位数输出,不会截断。有符号的数跟无符号的数比大小的话,会把有符号的数也转化为无符号的数,这个时候的结果可能就会有偏差。如果题目没有明确说明要按题目这个过程去写的话,可以手动简化算术的步骤。字符也是整型家族的成员。
2025-01-21 18:24:20
501
3
原创 C++入门
总结C和C++的不同点,一样且牢记的在课件里面一般不画出,C语言中没勾的自己一般也会再勾一次,不好看出不是通用的,要额外标注。以char类型打印的是打印的他的ASCII值对应的字符(charb='A'和charb=97是一样的)说明中说:对于100%的数据,输入的整数在[1,109]内--指的是题目测试时输入的数在这个范围内。编译失败给的原因是有有游离的...时,大概率是因为该用英文的地方用成了中文(比如;数的范围很大则一般用longlong类型来搞(longlong也是整数)
2025-01-18 21:05:01
353
4
原创 文件操作
fgets如果读取成功的话,返回的是目标空间的起始地址(str的),读取失败的话,会返回NULL。fscanf/fprintf -- 针对所有输入流/输出流 的格式化 输入/输出函数。用二进制的方式通过程序写到文本中,文本读不懂,但是把它放回原来的地方也可以用。scanf/printf--针对标准输入/输出流的 格式化 输入/输出函数。用fopen打开文件时,如果打开成功,返回的是有效的指针。fgetc在读取正常时,返回读取到的字符的ASCII值。二进制文件通过文本编辑打开时,是不行的。
2024-12-16 17:55:06
368
原创 自定义类型:结构体
offsetof是一个宏,可以计算结构体成员相较于结构体变量起始位置的偏移量。编译器会把两个匿名结构体类型当做俩个不同的类型来处理。结构体的成员在内存中是存在对齐现象的。结构体的关键字是struct。联合体的关键字是union。枚举的关键字是enum。eg:1不是4的倍数。
2024-12-08 20:41:34
321
原创 内存函数
强制类型转换只是临时的 比如:(char * *)dest++是不会按照char所占字节个数来+1的(这时候甚至会报错) 就算++放在前面,在有些编译器上也不行 但可以写为dest=(char ** )dest+1。C语言规定memcpy只要可以实现不重叠的拷贝就行了,但是VS上的memcpy可以实现重叠的拷贝,其他编译器不一定可以(memmove可以完全替代memcpy,自己用memmove)把一个受限制的地址交给一个不受限制的地址时,编译器会报警告。
2024-12-02 12:15:43
193
原创 字符函数和字符串函数
判断句变为strlen("abc")>strlen("abcdef") 或者给strlen的这两个强制类型转换成int类型的。这样写是不行的,因为减了后等于负3,但是又是无符号整数,所以直接用补码来换算成无符号整数,因此结果是一个很大的整数。把一个受限制的地址交给一个不受限制的地址时,编译器会报警告。VS用指令打开文件所用的文件名是扩展文件名后的文件名。字符串相关的函数的头文件都是<string.h>两个无符号整数算出来的值还是无符号整数。\0在条件判断中,认为是0。
2024-12-02 12:14:51
318
原创 深入理解指针(5)
比如:在printf中-4的打印 用%d打印时,会将补码转换成原码再转化为10进制打印出来 用%p打印时,因为地址是无符号整数,所以直接把补码按照16进制打印出来(补码的每四个数看做2进制,用此变为16进制)未说明时,问是多少个字节,则答在X86环境(即32位的)下的(比如:问int类型占多少个字节)p为地址时,p[i]和*(p+i)一般在何时何地均等价。地址的长度也是4个或8个字节(看是X64还是X86)%s打印字符串时,需要的就是地址来去打印。C语言中,一个字符占用一个字节。
2024-12-02 12:14:03
148
原创 深入理解指针(4)
strcmp比较的不是字符串长度,而是对应位上字符ASCII值得大小(比如abcdef比abcq小)两个字符串比较大小不能使用> >= <= < ++!=,应该使用strcmp。qsort函数是用来对数据进行排序的,对任意类型的数据都可以排序。qsort的头文件是<stdlib.h>qsort是C语言中的一种库函数。用冒泡排序来给任意类型的数据排序。-> 结构体指针->成员名。. 结构体变量.成员名。
2024-12-02 12:12:55
157
原创 深入理解指针(2)和(3)
一维数组传参时,设计的函数的参数可以写成数组,也可以写成指针。不管是一维数组还是二维数组,形参可以写成数组,也可以写成指针。*(arr+i)等于arr[i ],不是值,是地址。区分移动下标(p+i)和移动指针(p++)&函数名和函数名都是函数的地址,没有区别。二维数组的数组名就是它第一行的地址。简记:看conat在*左边还是右边。区分指针 指针的值 指针的地址。二维数组的首元素就是它的第一行。在一维数组中则是地址。
2024-12-02 12:12:10
201
原创 深入理解指针(1)
指针-指针的绝对值是指针和指针之间的元素个数(包含减数那个元素){指针减去指针,如果是大地址减去小地址则为正,反之则为负}放在*左边,限制的是指针指向的内容,也就是不能通过指针变量来修改它所指向的内容,但是指针变量本身是可以改变的。放在*右边,限制的是指针变量本身,指针不能改变他的指向,但是可以通过指针变量修改它所指向的内容。未初始化时,指针变量里面存的值是随机的(是随机的地址,这是解引用操作符就会形成非法访问)p为指针变量时,&p取得的是指针变量的地址,而不是指针变量指向的值得地址。
2024-12-02 12:08:26
614
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人