自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 资源 (3)
  • 收藏
  • 关注

原创 【项目实战】C++视频共享点播系统

适合大学生体质的优质大作业,欢迎大家使用,创作不易,如果感到喜欢请一键三联哦搭建视频共享点播服务器,可以让所有人通过浏览器访问服务器,实现视频的上传观看,以及管理并播放的功能。主要是完成服务器端的程序业务功能的实现以及前端访问界面 html 的编写,能够支持客户端浏览器针对服务器上的所有视频进行操作。、

2024-08-12 19:14:24 1791 5

原创 httplib库:用C++11搭建轻量级HTTP服务器

httplib库为C++开发者提供了一个快速搭建HTTP服务器的解决方案。通过本文的介绍和示例代码,你应该能够理解如何使用httplib创建HTTP服务,并处理基本的HTTP请求。虽然httplib功能强大,但在生产环境中使用时,还需要考虑安全性、错误处理、性能优化等多方面因素。

2024-08-12 19:08:55 468

原创 深入探索MySQL C API:使用C语言操作MySQL数据库

通过本文的介绍,你应该对MySQL的C语言API有了深入的了解。使用这些API,你可以在C语言项目中实现对MySQL数据库的高效操作。虽然现代开发中更倾向于使用高级语言和ORM框架,但直接使用MySQL C API为理解数据库操作的细节提供了宝贵的视角。

2024-08-12 18:23:17 929

原创 JSON与Jsoncpp库:数据交换的灵活选择

JSON是一种轻量级的数据交换格式,它基于文本,易于人阅读和编写,同时也易于机器解析和生成。JSON的数据结构包括以下几种:对象:由花括号{}包围,存储键值对。数组:由中括号[]包围,存储有序集合。字符串:由双引号""包围。数字:整数或浮点数。布尔值true或false。null:表示空值。例:⼩明同学的学⽣信息char name = "⼩明";则json这种数据交换格式是将这多种数据对象组织成为⼀个字符串:"姓名" : "⼩明","年龄" : 18,

2024-08-12 17:45:59 745

原创 RESTful API设计指南:构建高效、可扩展的Web服务

RESTful API是一种基于HTTP协议的设计风格,它通过使用统一的接口和无状态的通信方式,使得网络服务更加易于理解和使用。RESTful的核心概念包括资源(Resources)、统一接口(Uniform Interface)、无状态(Stateless)、可缓存(Cacheable)和分层系统(Layered System)。RESTful API以其简洁、直观和易于使用的特点,已经成为构建Web服务的首选方式。遵循上述设计原则和最佳实践,可以帮助开发者构建出更加高效、可扩展和易于维护的Web服务。

2024-08-12 15:53:39 321

原创 C++ - 负载均衡式在线OJ

这段代码实现了一个在线编程评判系统的HTTP接口,包括获取题目列表、获取题目详情和代码评判功能。通过设置路由和处理函数,服务器能够响应不同类型的HTTP请求,并与业务逻辑控制器交互,返回相应的结果。这段代码实现了一个在线编程评判系统的核心功能,包括主机管理、负载均衡、题目信息管理和用户代码的编译运行。它通过读取题目列表文件和对应的题目文件,将题目信息存储在内存中,以便于其他部分的程序访问和使用。方法用于处理用户的代码提交,选择一个主机进行代码编译和运行,并获取结果。

2024-07-30 19:17:19 922

原创 带你手把手实现简单的UDP

因为UDP是无连接,不可靠,并且以数据报进行传输数据的方式,所以我们实现的时候只需要用到socket和bind即可。

2024-07-30 17:02:08 433

原创 网络编程套接字

预备知识预备知识端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理网络字节序大端字节序(不管是大端机还是小端机器,在网络传输中,必须转化为大端存储方式传送)以下是转换函数。

2024-07-29 19:21:48 1182

原创 网络基础入门:从局域网到TCP/IP模型

在当今数字化时代,网络已成为我们日常生活和工作中不可或缺的一部分。无论是通过局域网(LAN)在家中连接多个设备,还是通过广域网(WAN)与世界各地的朋友进行通信,网络技术都扮演着核心角色。本文将带你走进网络的世界,从基础概念到TCP/IP模型,再到数据传输流程,为你揭开网络的神秘面纱。

2024-05-15 11:13:47 877

原创 Linux-线程互斥和死锁

在多任务操作系统中,如Linux,进程和线程需要访问共享资源,例如文件、数据库记录或内存区域。为了确保数据的一致性和完整性,操作系统引入了锁机制来控制对这些资源的访问。然而,不当的锁管理可能导致死锁,这是一种严重的性能问题。在本文中,我们将探讨Linux系统中的锁和死锁的概念、原因、预防以及解决方法。

2024-04-24 10:38:04 1077

原创 Linux - 线程

需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数 的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了 不该共享的变量而造成不良影响的可能性是很大的,换句话说。进程是多线程的,进程ID为157397,进程内有3个线程,线程ID分别为157387 157414 157415。数函数的名字都是以“pthread_”打头的。

2024-04-16 19:43:59 1075

原创 gitee如何新建仓库并用小乌龟上传代码

新建gitee仓库。

2024-04-14 21:47:17 694

原创 Linux——信号处理

在Linux系统中,是一个非常重要的概念,它允许通知进程。信号可以由等多种来源产生。为了有效地处理这些信号,Linux提供了一系列的系统调用和函数,其中signalsigaction是三个核心的函数。在本篇博客中,我们将详细介绍这三个函数的用法和特点。

2024-03-07 12:07:04 882 1

原创 Linux 进程间通信(IPC)详解:匿名管道、命名管道与共享内存

在现代操作系统中,是实现的关键技术。Linux系统提供了多种IPC机制,其中是最为常用的三种方式。本文将详细解析这三种IPC机制的原理、使用场景以及如何在C语言中实现它们。

2024-03-05 19:46:52 821

原创 Linux——动态库和静态库

与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。(动态链接器)能够找到并加载正确的库文件。

2024-03-04 20:39:19 1139

原创 C++ 特殊类设计

如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就不会防止成员函数内部拷贝了。

2024-02-28 11:16:07 862

原创 Java期末考试“大招”

String是不可变字符序列。StringBuilder也是可变的字符序列。string对象在常量池中,StringBuilder对象在堆上重载是在一个类中,方法名相同但参数类型、个数或顺序不同的方法重写是子类重新定义父类中已有的方法。

2023-12-25 17:19:23 1014 1

原创 详解—数据结构—<常用排序>基本实现和代码分析

1. 元素集合越接近有序,直接插入排序算法的时间效率越高2. 时间复杂度:O(N^2)3. 空间复杂度:O(1),它是一种稳定的排序算法4. 稳定性:稳定。

2023-12-24 20:41:48 1319

原创 详解—C++[智能指针]

什么是内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

2023-12-23 14:46:24 977

原创 详解—C++ [异常]

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。(这里的处理类似于函数的传值返回)2. 返回错误码的传统方式有个很大的问题就是,在函数调用链中,深层的函数返回了错误,那么我们得层层返回错误,最外层才能拿到错误,具体看下面的详细解释。

2023-12-19 19:41:01 996

原创 详解—【C++】lambda表达式

比如:[=, &a, &b]:以引用传递的方式捕捉变量a和b,值传递方式捕捉其他所有变量 [&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量 c. 捕捉列表不允许变量重复传递,否则就会导致编译错误。实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。

2023-12-15 14:41:19 1145

原创 详解—C++右值引用

而临时对象也是右值,因此在用临时对象构造s3时,也采用移动构造,将临时对象中资源转移到s3中,整个过程,只需要创建一块堆内存即可,既省了空间,又大大提高程序运行的效率。2. const修饰的常量,不可修改,只读类型的,理论应该按照右值对待,但因为其可以取地址(如果只是const类型常量的定义,编译器不给其开辟空间,如果对该常量取地址时,编译器才为其开辟空间),C++11认为其是左值。C++98中引用作用:因为引用是一个别名,需要用指针操作的地方,可以使用指针来代替,可以提高代码的可读性以及安全性。

2023-12-14 19:30:36 3151

原创 深入了解—C++11特性

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2023-12-13 15:03:52 1208

原创 详解C++位图/布隆过滤器+海量数据处理

当删除一个元素时,将其加入到B中。近似算法:可以使用布隆过滤器的方法,先将一个文件中的所有query插入到一个布隆过滤器中,然后遍历另一个文件中的query,用布隆过滤器检查是否可能存在于第一个文件中。1.我们常规的方法,直接遍历,时间复杂度O(N),但是40亿个数中寻找一个数,无异于大海捞针,直接遍历所消耗的时间还是很多,更别说我们用什么来存储这40亿个数❌。,这样其他比特位都是0,如果测试的比特位是1,则结果是非0,那就是true,如果测试的比特位是0,则结果是0,那就是false。

2023-12-12 09:29:27 1001

原创 详解—[Linux 文件描述符]

1、一个进程能够同时打开多个文件,对应需要多个文件描述符,所以需要用一个文件描述符表对文件描述符进行管理;在程序运行时,文件描述符会在进程启动时被继承,所以它们通常会被用来执行 I/O 操作,包括读取、写入文件以及打印输出等。标准错误(STDERR_FILENO):默认为 2,代表程序的标准错误输出流。5、已经被占用的文件描述符在被释放后,可以后面的文件描述符重新被占用;内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件。三个位置对应的文件描述符固定不变,标准输入、标准输出、标准错误;

2023-12-10 20:48:48 513

原创 详解—[C++数据结构]—哈希 <哈希表&&哈希桶>

在C++98中,STL提供了底层为红黑树结构的一系列在查询时效率可达到Log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对进行介绍,unordered_multimap和unordered_multiset可自行查看文档介绍。

2023-12-08 10:23:53 1202

原创 Linux详解—环境变量

如果没带路径,就会报出:command not found的错误,其实也很好理解,因为我们要执行一个命令或者程序首先肯定要找到这个程序或者命令,知道这个程序或者路径在哪里,才能够执行它,而系统中的命令不需要带路径就能执行的原因跟今天要学习的环境变量中的。我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。,只需要直接敲对应的命令即可,其实这些命令都是程序,而当。

2023-12-06 20:31:59 1064

原创 详解—[C++数据结构]—红黑树

红黑树的节点,我们这里使用的是三叉链,方便对后面内容的操作首先,我们定义了一个枚举常量,来表示红黑树节点的颜色其次,定义节点,一个红黑树的节点包含

2023-12-04 20:41:37 1499 2

原创 详解—[C++ 数据结构]—AVL树

AVL树每个节点都会记录他的左右孩子和父节点并且每个节点记录一下自己的平衡因子用模板T存储他的数据{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。

2023-11-29 18:47:54 1470

原创 详解STL库—map和set

T1 first;T2 second;pair(){}{}set文档介绍1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。

2023-11-28 18:46:36 1044

原创 Linux—进程状态

学习进程的状态,我们首先了解一下进程的基本数据。

2023-11-28 15:57:05 1011

原创 详解—C++三大特性——多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

2023-11-27 17:21:16 971

原创 详解——菱形继承及菱形虚拟继承

1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的语言都没有多继承,如Java。

2023-11-23 10:05:29 221

原创 C++三大特性——继承

5. 在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected > private。1. 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。下面我们看到Person是父类,也称作基类。

2023-11-23 08:40:08 46

原创 [C++ 数据结构]—搜索二叉树 模拟实现

3.从记录的根节点开始,判断如果比当前节点的数据大,往右子树寻找,小,往左子树走,如果相等,直接返回false,找到位置cur为空,记录他的父节点,然后开始插入。找到之后,对将要删除的节点合照到节点的值进行交换,再将被交换的值的节点进行删除(交换到要删除的节点肯定是叶子节点(没有孩子)),在这里我们首先判断 当前节点是否根节点(因为根节点的父节点为空),否则,判断删除节点的右节点要连接在父节点的左边还是右边。,也是先判断是否为根节点,在判断删除节点的左节点要链接在父节点的左边还是右边。

2023-11-12 17:38:59 117

原创 数据结构—二叉树的模拟实现(c语言)

详解—数据结构《树和二叉树》-CSDN博客上一节课我们详解了树和二叉树,这一篇博客我来带领大家来模拟实现二叉树。

2023-11-12 16:47:11 473

原创 详解—数据结构《树和二叉树》

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1

2023-10-31 15:09:26 142

原创 带你深入了解队列(c/cpp双版本模拟实现)

考虑到学校有好多老师上课,虽然说得是用c语言实现,却用cpp进行操作,现在给大家更新cpp版本的队列的模拟实现,cpp版本的扩容使用的new,函数参数使用的&,可能有同学对指针使用不太熟悉,所以我们同意用&(引用)来实现,方便大家的理解,就不再详细的进行说明了,思路跟c语言实现的一样,只是c和cpp的语言差距有所不同。3.如果队列有多个数据,新建一个节点cur等于队列“头”的下一个地址,然后释放掉队头,再把队头指向cur(以前对头的下一个地址),使得第二个数据成为队头。队列也可以数组和链表的结构实现,

2023-10-27 20:27:11 121

原创 带你深入理解“栈”(c语言 c++和stl Stack三个版本的模拟实现)

cpp版本的扩容使用的new,函数参数使用的&,可能有同学对指针使用不太熟悉,所以我们同意用&(引用)来实现,方便大家的理解,就不再详细的进行说明了,思路跟c语言实现的一样,只是c和cpp的语言差距有所不同。首先,进行判断,top栈顶等于capacity容量的时候,代表我们栈里的内存满了,这里我们需要扩容,用realloc对数组进行扩容,现在我进行的二倍扩容。当我们栈中的数据很少时,可能会浪费空间,而数据量很大的时候,栈有可能占不下大量的数据。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

2023-10-27 14:12:34 251 2

原创 (C++ STL) 详解vector模拟实现

这是官方的文档介绍1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。

2023-10-16 23:40:51 213

三子棋的test .c文件

三子棋的test .c文件 实现整个游戏框架,

2022-07-28

三子棋game.h文件

三子棋的头文件 主要是函数的声明

2022-07-28

三子棋game.c文件

三子棋代码 game.文件 主要是三子棋所需函数代码实现

2022-07-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除