- 博客(65)
- 问答 (1)
- 收藏
- 关注
原创 【C++】网络在线五子棋
本项目主要实现⼀个网页版的五⼦棋对战游戏,其主要⽀持以下核心功能:• 用户管理:实现用户注册,用户登录、获取用户信息、用户天梯分数记录、用户比赛场次记录等• 匹配对战:实现两个玩家在网页端根据天梯分数匹配游戏对手,并进行五子棋游戏对战的功能• 聊天功能:实现两个玩家在下棋的同时可以进⾏实时聊天的功能开发环境• Linux(Centos-7.6)• VSCode/Vim• g++/gdb• Makefile核⼼技术• HTTP/WebSocket• Websocket++• JsonCpp
2023-10-24 10:34:41
851
1
原创 【Linux】基础IO,软硬链接,动静态库
I/O简单来说对应的就是两个单词Input和Output,指的是计算机系统与外部环境(通常是硬件设备或其他计算机系统)之间的数据交换过程
2023-09-18 21:34:37
520
原创 【Linux】进程控制,进程替换
在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。进程调用fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给子进程将父进程部分数据结构内容拷贝至子进程添加子进程到系统进程列表当中fork返回,开始调度器调度当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程。fork之前父进程独立执行,fork之后,父子两个执行流分别执行。
2023-09-14 15:16:07
437
2
原创 【Linux】进程优先级,环境变量,进程地址空间
当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行,所以,调整进程优先级,在Linux下,就是调整进程nice值nice其取值范围是-20至19,一共40个级别。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进程的优先级变化。
2023-09-08 21:20:14
490
原创 【C++】 C++11(右值引用,移动语义,bind,包装器,lambda,线程库)
C++11是C++语言的一次重大更新版本,于2011年发布,它包含了一些非常有用的新特性,为开发人员提供了更好的编程工具和更好的编程体验,使得编写高效、可维护、安全的代码更加容易。强制类型枚举,使得枚举类型的通常行为更加可靠和容易控制。自动类型推导(auto),可以根据实际情况自动推断变量类型,使得代码更加简洁和易于阅读。Lambda表达式,支持匿名函数,提供了一种简单且强大的方式来定义和使用函数对象。全局函数类型推导,可以自动推断函数返回类型,避免重复定义。
2023-09-01 22:03:29
411
原创 【C++】哈希和unordered系列封装
unordered_map文档说明unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2023-05-01 20:32:55
635
7
原创 【C++】模拟实现map和set
set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行 排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对 子集进行直接迭代。5. set在底层是用二叉搜索树(红黑树)实现的。
2023-04-29 12:36:52
1026
9
原创 【数据结构】简单快速过一遍红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。
2023-04-21 18:58:40
933
6
原创 二叉树搜索树 && AVL树
AVL树节点的定义:采用的是三叉链结构T data;// 该节点的左孩子 AVLTreeNode < T > * _right;// 该节点的右孩子 AVLTreeNode < T > * _parent;// 该节点的双亲 int _bf;
2023-04-04 13:16:46
761
5
原创 【C++】类和对象三大特性--多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写那问题来了,什么是虚函数呢?在多态中,通常父类中虚函数的实现是毫无意义的,主要都是调用子类重写的内容因此可以将虚函数改为纯虚函数在虚函数的后面写上 =0 ,则这个函数为纯虚函数。
2023-03-21 12:28:47
1023
13
原创 【C++】类和对象三大特性--继承
继承是面向对象三大特性之一继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用有些类与类之间存在特殊的关系,例如下图中:我们发现,定义这些类时,下级别的成员除了拥有上一级的共性,还有自己的特性。这个时候我们就可以考虑利用继承的技术,减少重复代码。
2023-02-16 14:12:21
2729
16
原创 【C++】stack和queue相关
priority_queue文档介绍优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭。
2023-02-06 20:56:01
740
22
原创 【C++】list用法&&简单模拟实现
链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的
2023-01-11 18:48:32
739
17
原创 【C++】vector用法&&简单模拟实现
vector的文档介绍(包含函数接口使用)(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造it!it ++) {//无参构造 for(int i = 0;i < 10;i ++) {//使用迭代器进行初始化构造 printVector(v2);//构造并初始化10个100 printVector(v3);//拷贝构造 printVector(v4);return 0。
2023-01-05 10:22:03
1900
12
原创 【C++】string使用&&模拟实现
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在刷OJ题中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。string类的文档介绍string是C++风格的字符串,而string本质上是一个类。
2022-11-30 18:30:14
786
21
原创 【Linux】初识系统调用&&进程状态
在linux中,系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以根据这组接口获得操作系统内核的服务;系统调用规定了用户进程陷入内核的具体位置,或者说规划了用户访问内核的路径,只能从固定位置进入内核。通俗点讲:在开发角度,操作系统对外会表现为一个整体,但是会暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用。
2022-11-22 21:00:15
1112
19
原创 【C++】初识STL
是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。标准模板库)STL 从广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数。
2022-11-15 09:03:04
450
35
原创 【C++】泛型编程之模板初阶
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定。重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函。比如:让你实现一个通用的交换函数,在没有泛型编程的时候,我们大概率只能实现下面的代码。有人给出了论调:懒人创造世界。
2022-11-11 12:23:25
460
25
原创 【C++】内存管理——我要new一个对象
new/delete 和 C语言传统的malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数class A {public :} ~ A() {int _a;};// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间 //还会调用构造函数和析构函数 A * p1 =(A *) malloc(sizeof(A));free(p1);
2022-11-07 09:05:55
955
19
原创 【Linux】gcc/g++ 和 gdb && git工具的基本使用方式
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建只要我们的makefile写得够好,所有的这一切,我们只用一个make命令就可以完成,make命令会自动智能地根据当前的文件修改的情况来确定哪些文件需要重编译,从而自动编译所需要的文件和链接目标程序。在默认的方式下,也就是我们只输入make命令。那么,make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2022-11-03 07:55:09
929
28
原创 用C++实现一个日期类
在前面的章节中,已经初步理解类和对象的基本思想,也知道了类和对象的一些特性。而前面一直贯穿着我们学习类和对象的例子“日期类(Date)”一直只是定义了它的属性,而这一章我们就要运用前面的知识去完善这一个日期类的实现!
2022-10-31 09:02:09
1299
13
原创 【Linux】yum && vim 基础工具的使用
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系.
2022-10-29 08:37:23
923
23
原创 【C++】类和对象(下)
在之前的章节中我们在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值1.2 初始化列表作用:C++提供了初始化列表语法,用来初始化属性语法:【注意】每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)类中包含以下成员,必须放在初始化列表位置进行初始化:引用成员变量**const成员变量自定义类型成员(且该类没有默认构造函数时)尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表初始化。成员变量在类中声明次序就
2022-10-24 09:00:04
256
31
原创 Linux权限理解
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?将使用者的命令翻译给核心(kernel)处理。同时,将核心的处理结果翻译给使用者对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的。
2022-10-20 08:00:00
774
19
原创 【C++】类和对象(中)
在上一章我们提到如果一个类中什么成员都没有,简称为空类 。而且空类的大小为1个字节,那空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。对象的初始化和清理也是两个非常重要的安全问题 一个对象或者变量没有初始状态,对其使用后果是未知 同样的使用完一个对象或变量,没有及时清理,也会造成一定的安全问题c++利用了构造函数和析构函数解决上述问题,这两个函数将会被编译器自动调用,完成对象初始化和清理工
2022-10-16 10:09:40
784
21
原创 【C++】类和对象(上)
**C语言**是**面向过程的**,关注的是**过程**,分析出求解问题的步骤,通过函数调用**逐步解决问题** **C++**是基于**面向对象的**,关注的是**对象**,将一件事情拆分成不同的对象,靠对象之间的交互完成。
2022-10-11 09:16:12
508
30
原创 【Linux】Linux下基本指令
Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作、文件存取、目录操作、进程管理、文件权限 设定等- 在职场中,大量的 **服务器维护工作都是在 远程 通过 **SSH 客户端** 来完成的,并没有图形界面,所有的维护工作都需要通过命令来完成- 在职场中,作为后端程序员,必须要或多或少的掌握一些 Linux 常用的终端命令- Linux 发行版本的命令大概有 200 多个,但是常用的命令只有 10 多个而已
2022-10-05 10:28:31
393
31
原创 【C++】引用和一些小语法扩展
C++11中,标准委员会赋予了auto全新的含义即:**auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得 **。//下面的无法通过编译,使用auto定义变量时必须对其进行初始化 //auto f;//auto e;return 0;}【注意】使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。
2022-10-01 12:27:57
1337
21
原创 【C++语法】基于C语言补充的一些基础C++语法
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指针方面、宏方面等。为后续类和对象学习打基础因为C++是在C的基础上扩展和补充,所以在C++中是兼容C语言的,C语言的语法都可以在C++中使用!!!定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
2022-09-26 12:22:17
1510
33
原创 【C++】初窥C++
学习C++之前当然得见识一下我们的祖师爷—本贾尼·斯特劳斯特卢普C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。
2022-09-18 10:39:25
1591
32
原创 【数据结构】经典八大排序算法(万字大总结+动图)
下面是一些排序的实测数据结果(冒泡,非比较排序不在里面)单位ms一共是一百万个随机数可以看出仅仅一百万个数据插入排序和选择排序的速度是非常缓慢的。
2022-09-11 09:51:01
2962
95
原创 【二叉树】链式结构的一些操作实现
✨目录1.二叉树链式结构的实现从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的二叉树的链式结构在代码中的定义2.二叉树的遍历。
2022-08-18 09:15:25
556
92
原创 【二叉树】数中的特殊结构->堆
满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是 ,则它就是满二叉树。. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。关于性质三一道题目:答案:A解析:对任何一棵二叉树, 如果度为0其叶结点个数为n0 ........
2022-08-13 13:11:45
976
124
原创 【刷题系列】链表经典OJ题
快慢指针法:定义两个指针fast和slow,fast一次走两步,slow一次走一步,相等位置为相遇点,在相遇点断开,转化成两个链表相交求交点问题。快慢指针法,定义两个指针,fast,slow,让fast一次走两步,slow一次走一步,fast走到NULL,slow就是中间节点。来源:力扣(LeetCode)......
2022-08-10 12:00:11
643
73
原创 C/C++【程序环境和预处理】
这些预定义符号都是语言内置的__FILE__//进行编译的源文件__LINE__//文件当前的行号__DATE__//文件被编译的日期__TIME__//文件被编译的时间__STDC__//如果编译器遵循ANSIC,其值为1,否则未定义//文件被编译的日期printf("%d\n",__LINE__);//输入当前行号return0;}语法10000break;caseregister()*注意这个宏存在一个问题观察下面的代码段().........
2022-08-01 20:01:44
319
66
原创 【C语言】文件操作
缓冲区的大小根据C编译系统决定的。至于结构体FILE里面的内容我们可以暂时不管,因为每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件(直接打开一般是乱码).
2022-07-27 14:21:59
510
109
谷歌宣布了一门新的编程语言Carbon会取代C++吗
2022-08-05
TA创建的收藏夹 TA关注的收藏夹
TA关注的人