- 博客(47)
- 收藏
- 关注
原创 【C++进阶】第五节:哈希
unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序,为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2025-01-17 11:41:16
802
原创 【C++进阶】第四节:map和set
与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。set中插入元素时,只需要插入value即可,不需要构造键值对。set中的元素不可以重复(因此可以使用set进行去重)。使用set的迭代器遍历set中的元素,可以得到有序序列set中的元素默认按照小于来比较set中查找某个元素,时间复杂度为:set中的元素不允许修改。
2025-01-01 19:03:54
780
原创 【C++进阶】第三节:二叉树
比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出现次数就是<word, count>就构成一种键值对。a、从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
2024-12-13 10:57:19
622
原创 【C++进阶】第二节:多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了Person。Person 对象买票全价,Student 对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象,派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。
2024-12-06 16:19:33
648
原创 【C++进阶】第一节:继承
下面我们看到 Person 是母类,也称作基类。Student 是女类,也称作派生类。很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一定不要设计出菱形继承,否则在复杂度及性能上都有问题。继承和组合public 继承是一种 is-a 的关系。也就是说每个派生类对象都是一个基类对象。组合是一种 has-a 的关系。假设B组合了A,每个B对象中都有一个A对象。优先使用对象组合,而不是类继承。
2024-12-03 11:41:19
921
原创 【C++】第十一节:模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2024-12-02 09:53:35
874
原创 【C++】第十节:stack和queue
public:void pop()private:102. 二叉树的层序遍历 - 力扣(LeetCode)public:if (root)while (!return vv;优先级队列默认使用 vector 作为其底层存储数据的容器,在 vector 上又使用了堆算法将 vector 中元素构造成堆的结构,因此 priority_queue 就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
2024-11-28 11:42:27
1082
原创 【C++】第九节:list
此处大家可将迭代器暂时理解成类似于指针,迭代器失效即迭代器所指向的节点无效,即该节点被删除了。因为 list 的底层结构为带头结点的双向循环链表,因此在 list 中进行插入时是不会导致迭代器失效的,只有删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
2024-11-19 16:56:58
649
原创 【数据结构】排序
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后的序列中,r[i] 仍在r[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的。:数据元素全部放在内存中的排序。:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2024-11-17 11:08:48
982
原创 【C++】第八节:vector
迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T*。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃。当*it等于偶数时,调用v.erase(it)并将返回的迭代器赋值给it,因此,即使元素被删除,it也会被更新为指向下一个有效元素,避免了无效的迭代器访问。以下代码的功能是删除vector中所有的偶数,哪个代码是正确的?
2024-10-30 09:46:44
1736
原创 【Linux】进程控制
在 linux 中 fork 函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:子进程返回0,父进程返回子进程 id,出错返回-1。fork 之前,只有一个进程在运行。用户空间是指用户应用程序运行的区域,内核空间是操作系统核心部分运行的区域。fork 之后,系统创建了一个新的子进程。fork 之前,父进程在用户空间中运行。父进程调用 fork() 后进入内核空间。fork 之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。
2024-10-28 13:22:41
1134
原创 【数据结构】二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。注意:树形结构中,子树之间不能有交集,否则就不是树形结构。
2024-10-22 18:21:20
1357
原创 【C++】第五节:内存管理
int main()// new/delete和malloc/free最大的区别是// new/delete对于自定义类型除了开空间还会调用构造和析构函数free(p1);delete p2;// 内置类型几乎是一样的free(p3);delete p4;free(p5);return 0;_size++;~Stack()
2024-10-11 15:14:28
997
原创 【C++】第四节:类与对象(下)
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
2024-10-05 11:41:14
1001
原创 【C++】第三节:类与对象(中)
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
2024-10-03 18:05:01
874
原创 【C++】第二节:类与对象(上)
/ 类体:由成员函数和成员变量组成// 分号不能忘记class 为定义类的关键字,ClassName 为类的名字,{} 中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为成员变量;类中的函数称为成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。// 人public:public:int _age;
2024-10-02 10:44:17
1033
原创 【C++】第一节:C++入门
/ 1. 命名空间定义// 命名空间中可以定义变量/函数/类型int val;// 2. 命名空间可以嵌套int a;int b;int c;int d;// 3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成在同一个命名空间中// 一个工程中的test.h和上面test.cpp中两个N1会被合并成一个// test.h注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
2024-10-01 15:32:41
1320
原创 【Linux】Linux环境基础开发工具使用
vim的三种模式,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。正常/普通/命令模式:插入模式:末行模式:在命令模式下,即可进入该模式。
2024-09-28 12:06:29
1218
原创 【数据结构】栈和队列(有完整的模拟实现代码!)
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,。出栈:栈的删除操作叫做出栈。。
2024-09-28 11:13:58
374
原创 【C语言进阶】第七节:程序环境和预处理√
_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义这些预定义符号都是语言内置的。#define reg register//为register这个关键字,创建一个简短的名字不要在最后加分号,容易导致问题,例如:max = MAX;分号书写:当定义的内容较长时,可以通过反斜杠 \ 进行续行。
2024-09-25 11:36:57
875
原创 【C语言进阶】第六节:文件操作√
读取成功时返回读到的字符,读取到文件末尾或读取失败时返回EOFint main()return 1;//读文件//关闭文件fclose(pf);pf = NULL;return 0;
2024-09-24 12:20:14
1186
原创 【C语言进阶】第五节:动态内存管理√
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个 NULL 指针,因此 malloc 的返回值一定要做检查。返回值的类型是 void*,所以 malloc 函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。如果参数 size 为0,malloc 的行为是标准是未定义的,取决于编译器。她们都声明在 stdlib.h 头文件中。
2024-09-23 15:56:32
916
原创 【C语言进阶】第四节:自定义类型详解√
位段的成员必须是 int、unsigned int 或signed int位段的成员名后边有一个冒号和一个数字struct Aint _a : 2;int _b : 5;A就是一个位段类型。那位段A的大小是多少?答案:8enum Color//颜色RED,GREEN,BLUE{}中的内容是枚举类型的可能取值,也叫枚举常量。这些可能取值都是有值的,默认从0开始,依次递增1,当然在声明枚举类型的时候也可以赋初值。联合是一种特殊的自定义类型。
2024-09-23 11:25:14
315
原创 【C语言进阶】第二节:指针√
数组指针是指针,是能够指向数组的指针下面代码哪个是数组指针?[]的优先级比*高,所以p1先和[]结合组成一个数组,所以p1是一个指针数组。p2是数组指针,因为p先和*结合,说明p是一个指针变量,然后指向的是一个大小为10的整型数组。
2024-09-19 21:01:56
1015
原创 【C语言进阶】第一节:数据的存储√
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。为什么会有大端和小端:因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。
2024-09-14 17:48:01
840
原创 C语言入门第八节:实用调试技巧√
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。F5启动调试,经常用来直接跳到下一个断点处。F9创建断点和取消断点断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。F10逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。F11。
2024-09-14 11:28:14
358
原创 【Linux】常见指令以及权限理解
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel)“ ,但我们一般用户,不能直接使用kernel。,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。2 是系统调用,如open,write之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件),我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作。whereis:在系统特定的路径下查找,既可以找到可执行程序,又可以找到手册,安装包,压缩包等。
2024-09-14 10:21:45
739
原创 C语言入门第七节:结构体√
int x;int y;}p1;//声明类型的同时定义变量p1//定义了一个Point类型的变量p2//初始化:定义变量的同时赋初值。
2024-09-11 11:54:57
206
原创 C语言入门第六节:指针√
/指针+-整数//这里要加上解引用操作符,因为s只是数组的地址while (*s!= '\0')s++;len++;return len;//指针-指针//先保存数组的首地址while (*s!= '\0')s++;
2024-09-10 18:10:19
280
原创 【数据结构】顺序表和链表√
线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
2024-09-10 17:10:21
1150
原创 C语言入门第五节:操作符详解√
当数组作为一个函数的参数传递时,它实际上是传递了数组首元素的地址,即指针,而不是整个数组的拷贝,所以test1和test2中sizeof计算出来的大小在32位平台下都是4字节。如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。exp1为真的话整个表达式的结果是exp2的结果,为假的话整个表达式的结果为exp3的结果。逻辑与操作符用于连接条件,仅当两个条件都为真(非0值)时,整个表达式的结果才为真(1)。整个表达式的结果是最后一个表达式的结果。
2024-09-05 13:03:22
1154
原创 C语言练习:扫雷游戏(排除了一些bug,放心食用!)√
宏定义方便我们后续修改棋盘数据//设置10个雷//显示给玩家看的棋盘为9行9列//程序员看到的棋盘为11行11列//程序员看到的//玩家看到的//初始化棋盘//1. mine数组最开始是全'0'//2. show数组最开始是全'*'//打印棋盘//1. 布置雷//2. 排查雷。
2024-09-04 21:21:06
683
原创 【数据结构】时间复杂度空间复杂度√
大O符号(BigOnotation):是用于描述函数渐进行为的数学符号。用常数1取代运行时间中的所有加法常数。在修改后的运行次数函数中,只保留最高阶项。如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。另外有些算法的时间复杂度存在最好、平均和最坏情况,在实际中一般情况关注的是算法的最坏运行情况。
2024-09-04 12:57:52
1239
原创 C语言数组练习:三子棋超详细讲解√
while (1)//玩家下棋//判断输赢if (ret!//电脑下棋//判断输赢if (ret!printf("玩家赢啦\n");printf("电脑赢了\n");elseprintf("平局\n");
2024-09-03 17:52:28
463
原创 C语言入门第四节:数组√
sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数组。&数组名,取出的是数组的地址。&数组名,数组名表示整个数组。数组名是数组首元素的地址。
2024-09-03 11:18:05
384
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人