- 博客(44)
- 收藏
- 关注
原创 c++(c++11)
C++11 是 C++ 的第二个主要版本,并且是从 C++98 起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对 C++ 程序员可用的抽象。在它最终由 ISO 在 2011 年 8 月 12 日采纳前,人们曾使用名称“C++0x”,因为它曾被期待在 2010 年之前发布。C++03 与 C++11 期间花了 8 年时间,故而这是迄今为止最长的版本间隔。从那时起,C++ 有规律地每 3 年更新一次。
2025-03-30 10:39:37
628
原创 c++(哈希以及封装)
哈希(hash)⼜称散列,是⼀种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建立⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找。
2025-03-23 16:35:02
1030
原创 c++(红黑树以及封装)
红黑树是⼀棵二叉搜索树,他的每个结点增加⼀个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何⼀条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保没有⼀条路径会比其他路径长出2倍,因而是接近平衡的。
2025-03-22 19:29:26
863
原创 c++(AVL树及其实现)
AVL树是最先发明的自平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右子树都是AV树,且左右子树的高度差的绝对值不超过1。AVL树是⼀颗高度平衡搜索⼆叉树,通过控制高度差去控制平衡。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis是两个前苏联的科学家,他们在1962年的论文《An algorithm for the organization of information》中发表了它。
2024-09-28 10:55:10
791
4
原创 c++:set和map
1、set的声明如下,T就是set底层关键字的类型2、set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第⼆个模版参数3、set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。⼀般情况下,我们都不需要传后两个模版参数。4、set底层是用红黑树实现,增删查效率是 ,迭代器遍历是走的搜索树的中序,所以是有序的。
2024-09-26 17:05:59
761
原创 c++二叉搜索树
二叉搜索树又称二叉排序树,它或者是⼀棵空树,或者是具有以下性质的二叉树:• 若它的左子树不为空,则左子树上所有结点的值都小于等于根结点的值• 若它的右子树不为空,则右子树上所有结点的值都大于等于根结点的值• 它的左右子树也分别为⼆叉搜索树• 二叉搜索树中可以支持插⼊相等的值,也可以不支持插入相等的值,具体看使用场景定义,map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不支持插入相等值,multimap/multiset支持插⼊相等值。
2024-09-16 10:58:07
1013
1
原创 c++多态
多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是函数重载和函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态,之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时⼀般归为静态,运行时归为动态。
2024-09-13 17:23:25
1265
原创 c++(继承、模板进阶)
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。(因为翻译的原因,所以既叫父类/子类,也叫父类/子类)
2024-09-10 15:36:01
1164
1
原创 初识c++(stack,queue)
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问。
2024-08-09 16:07:34
814
2
原创 初识c++——list
由于list的储存空间不是连续的,所以我们要单独实现++/–等操作,所以我们直接放在一个类中去实现它(但是我们还是用节点指针去实现它,所以成员函数还是节点指针),这里以const_iterator为例子。这里唯一要注意不能删除哨兵位的节点,这样会导致无法访问该list(begin,end都和l哨兵位有关),所以erase不能删除end的节点(end指向的就是哨兵位节点)我们在平时可将迭代器暂时理解成类似于指针,
2024-07-30 21:52:05
567
3
原创 初识c++——vector
reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。resize在开空间的同时还会进行初始化,影响size。
2024-07-27 23:32:27
2466
5
原创 初识c++(模板,STL)
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误// 扩容++_size;STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2024-07-19 22:01:45
946
3
原创 初识c++(内存管理)
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;new的原理调用operator new函数申请空间。
2024-07-19 21:12:12
1069
2
原创 初识c++(类与对象下:构造函数,析构函数,拷贝构造函数,赋值运算符重载)
默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。自动调用:⼀个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解⼀下即可。默认成员函数很重要,也比较较复杂,我们要从两个方面去学习:• 第⼀:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。• 第⼆:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫
2024-07-12 16:40:31
942
3
原创 初识c++(类与对象——上)
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前面或者后面加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例。• C++中struct也可以定义类,C++兼容C中struct的用法,同时struct升级成了类,明显的变化是struct中可以定义函数,一般情况下我们还是推荐用class定义类。• 定义在类面的成员函数默认为inline。
2024-07-11 20:20:56
1039
原创 初识c++(引用,inline,nullprt)
引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,它和它引用的变量共用同⼀块内存空间。
2024-07-09 20:55:06
1102
4
原创 初识c++(命名空间,缺省参数,函数重载)
1、定义命名空间,需要使用法到namespace关键字,后面跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。(注意{}后不跟“;”)。2、namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。3、C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/
2024-07-08 19:18:48
2026
10
原创 排序算法——上
我们从左边开始把相邻的两个数两两做比较,当一个元素大于右侧与它相邻的元素时,交换它们之间位置;反之,它们之间的位置不发生变化。冒泡排序是一种稳定的排序算法。
2024-05-28 15:12:19
1165
11
原创 树的层序遍历,平衡二叉树,以及反转二叉树
层序遍历的实现:1.依赖于队列的数据结构2.核心怎么实现:1)创建一个队列的容器对象。2)判断根节点是否为空,不为空则添加根节点到队列中。3)遍历是一个循环性的工作,写一个死循环,死循环的第一步就是跳出死循环的条件:当队列中没有东西时退出(换句话说,没东西可遍历了)。4)每弹出一个元素,再访问(就是进行符合场景的操作),最后添加两边的左右子节点(如果不为空的话)。
2024-05-25 19:30:50
466
9
原创 二叉树的基本操作以及二叉树部分oj题
注意!给第一个if条件不能加k==1,因为可能会出现下面的情况当左子树还没有到k==1时直接跳出循环,如果加上可能会导致对空指针的引用。
2024-05-22 21:42:18
405
10
原创 Topk问题以及二叉树的三种层序遍历和基本操作
1、问题描述TOP-K问题:即求数据结合中前K个最大的元素或者最小的元素,一般情况下数据量都比较大。比如:专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。2、思路对于Top-K问题,能想到的最简单直接的方式就是排序,但是:如果数据量非常大,排序就不太可取了(可能数据都不能一下子全部加载到内存中)。最佳的方式就是用堆来解决,基本思路如下:1.前k个最大的元素,则建小堆前k个最小的元素,则建大堆2.
2024-05-19 19:22:55
493
9
原创 队列的实现以及队列如何实现栈
因为队列对头节点和尾节点使用多,所以我们用一个结构体封装出其头节点和尾节点的地址,会更加方便我们后续的操作:三、.c文件的实现1、初始化2、销毁注意这个与链表的销毁很想,不能简单的只释放Queue节点,而是要通过循环将每一块申请的空间都释放(充分体现了链表的物理结构不连续) 3、插入4、出列5、访问头数据6、访问尾数据7、判断是否为空和获取数据个数四、用队列实现栈我们知道栈是先出后进,而队列是先进先出;为了操作简单,我们在一
2024-05-11 17:18:11
645
6
原创 栈的实现以及c语言解决括号匹配问题
出栈其实非常简单只需要将top减1就可以了,但要注意top不能减到0,因为指向0的时候就没有元素了,数组大小为0;那么有没有可能出现错过的情况?这里我们就要认真审题。这题恰好用到了我们刚昂实现的栈的知识,
2024-05-07 21:11:37
848
13
原创 链表带环问题的方法证明
由上面可知道当fast==2slow的时候一定相遇,那么当fast!=2slow呢,一定会相遇吗?,有没有可能出现不相遇的情况?那么当fast==任意倍的slow时都是可以的,只不过证明起来比较麻烦,举一个4倍的例子。链表带环问题比较传统的思路是使用快慢指针,当快和慢指针相遇的时候那么说明此链表带环。上述办法求出环的入口,从入口开始走走到再次走到入口时走过的距离就是环长。理论上来说是存在追不上的情况的,对不对呢?那么这个是为什么,难道是偶然吗?所以我们可以很容易写出下面的代码。
2024-04-29 21:05:00
451
11
原创 顺序表实现通讯录
通讯录是非常典型的顺序表使用示例,其最后的永久保存数据更是需要我们使用文件函数,代码总量也是非常大足足有400多行,需要大家好好消化。期待下一次和你们一起van♂。
2024-04-04 16:44:22
1404
12
原创 顺序表的实现
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。可动态增长的数组,要求数据是连续存储的。//类型重命名,后续要存储其它类型时方便更改//指向动态开辟的数组//有效数据个数//容量大小}SL;注意将数组定义为数组指针:如果定义为数组则属性表空间太大,造成空间浪费。顺序表是比数组更加灵活的存储方式,也是我们接触的第一个数据结构,熟练掌握是十分重要的。
2024-04-04 11:01:24
393
10
原创 文件的操作
其中只有fread和fwrite适用于文件流,其他的适用于所有流只是将从键盘上读取数据改成了从文件里读取数据,将数据打印在屏幕上改成了打印在文件内。下面以fgetc和fputc为例子FILE *fp;int c;int n = 0;perror("打开文件时发生错误");return(-1);dobreak;}while(1);fclose(fp);return(0);假设我们有一个文本文件file.txt,它的内容如下。FILE *fp;int ch;
2024-03-29 18:52:49
1987
9
原创 浮点数的存储。
浮点数在内存中的存储是相当复杂的,无数小哲♂学家被其折♂磨得痛不欲生,接下来就让本哲♂学家带你们深入了解浮点数在内存中的存储。
2024-03-16 21:40:02
983
10
原创 常见内存函数
在前面的博客里我们学习了一系列的字符串函数,但那些函数只能处理字符串,今天让本哲♂学家将带大家一起学习能够处理其他类型数据的函数——内存函数。这些函数拜托了以往我们所学字符串函数只能处理字符串的限制,让我们可以处理更多数据,是十分有用的工具。同时memmove的实现一定要好好思考,能进一步提高我们的编程能力。期待我们下一次一起van。
2024-03-15 20:34:50
833
6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人