自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(123)
  • 收藏
  • 关注

原创 Git原理与使用

为了能够更⽅便我们管理不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。⽬前最主流的版本控制器就是Git。Git可以控制电脑上所有格式的⽂件,例如doc、excel、dwg、dgn、rvt等等。对于我们开发⼈员来说,Git最重要的就是可以帮助我们管理软件开发项⽬中的源代码⽂件!

2024-09-03 00:06:55 1247 1

原创 c++并查集

在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。例如某公司今年校招共招10个人,北京招4人,河南招3人,西安招3人,10个人来自不同的学校,刚开始互相都不认识,所以每个人都是一个独立的小团体,我们给这些人进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

2024-04-27 23:03:05 1587

原创 Qt 信号与槽

在 Qt 中,⽤⼾和控件的每次交互过程称为⼀个事件。⽐如 “⽤⼾点击按钮” 是⼀个事件,“⽤⼾关闭窗⼝” 也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出 “按钮被点击” 的信号,⽤⼾关闭窗⼝会发出 “窗⼝被关闭” 的信号。Qt 中的所有控件都具有接收信号的能⼒,⼀个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗⼝接收到 “按钮被点击” 的信号后,会做出 “关闭⾃⼰” 的响应动作;

2024-01-26 17:51:13 1555

原创 MySQL Connect

MySQL数据库的基础知识我们前面已经学习了,下面我们就开始学习怎么将MySQL数据库和我们学习的C/C++等语言连接。要使用C语言连接mysql,需要使用mysql官网提供的库。对于MySQL链接库中接口的使用,我们可以查阅官方文档。在MySQL的文档中,我们看到MySQL还构建了一些结构体,为了更好的使用接口函数。我们想要使用MySQL库,就必须先进行初始化,即需要先调用mysql_init函数来进行初始化。

2024-01-26 15:35:29 1441

原创 MySQL用户管理

我们前面学习MySQL数据库,一直都使用root用户来登录数据库并且进行操作。其实这样是存在安全隐患的,因为root用户是权限最高的用户,可以对所有数据库进行操作,这样数据库的安全性就会存在隐患,即如果不是自己登录了root用户,那么可以随便修改我们的数据库中的内容了。所以MySQL中就有了用户管理,通过对每个用户的权限进行设置,可以让不同的用户看到不同的数据库。

2024-01-25 22:26:41 1425

原创 MySQL视图

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

2024-01-25 19:57:11 429

原创 MySQL事务管理

我们在学习Linux和C++时,知道了有些程序在并发场景下会出现问题。那么如果对MySQL数据库进行CURD操作时,如果不加以控制,也是会出现问题的。例如下面的一个案例。当客户端A判断tickets表中的nums值大于0后,还没有执行update语句。此时并发执行的客户端B也判断tickets表中的nums值大于0,然后客户端B执行update语句将nums减1,然后此时客户端A也将nums减1,这样的话就造成了同一张票被卖了两次的情况。

2024-01-25 19:26:28 904

原创 Qt 概述

当我们安装了Qt Creater后,我们创建一个新项目。Build System为选择构建工具。Qt框架会在编译时自动先调用一系列的生成工具,基于我们写的代码生成一系列其它的C++代码,然后最后将这些代码进行编译。qmake是老牌的Qt构建工具了,CMake并非是Qt专属的构建工具,很多其它项目也会使用CMake构建。Qbs为Qt新一代的构建工具。我们选择qmake即可。Translation File为Qt国际化相关的内容,在这里可以选择翻译文件,我们现在暂时不关注。

2024-01-24 18:47:58 1012

原创 MySQL索引

当我们有一个海量数据的表时,在查询的时候,如果我们使用正常的sql语句进行查询,我们看下面的案例。我们先构建一个有8000000条数据的表。下面的index_data.sql文件中存储了表的创建语句和插入数据的语句,并且可以随机生成8000000条随机数据。因为需要插入8000000条数据,所以建表的过程很慢,大概需要几分钟。当emp表创建成功后,我们可以使用select语句进行数据查询,然后我们可以明显感觉到当表中数据较多时,我们使用前面学习到的普通查询语句会很耗时。

2024-01-22 15:46:02 1800

原创 MySQL表的内连和外连

表的连接分为内连接和外连接。

2024-01-15 19:24:45 612

原创 MySQL复合查询

前面我们讲解的mysql表的查询都是对一张表进行查询,在实际开发中这远远不够。下面我们来学习一些MySQL中更复杂的查询。下面的表还是来自oracle 9i的经典测试表。EMP员工表DEPT部门表SALGRADE工资等级表查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J可以看到内置函数在where子句中也是可以使用的。按照部门号升序而雇员的工资降序排序使用年薪进行降序排序。

2024-01-15 18:53:51 1144

原创 MySQL内置函数

current_函数使用date函数使用会返回参数的日期部分。date_add和date_sub使用我们看到可以在内置函数中再次调用内置函数。datediff函数创建一个记录生日的表下面我们创建一个表用来记录用户的生日。我们将birthday设为date日期类型。当我们插入数据时,我们看到正常的日期可以插入进行。并且now()函数和current_timerstamp()函数返回的日期时间类型也可以插入进行。但是为什么current_time()函数返回的时间类型也能插入进去呢?

2024-01-15 11:50:16 1660

原创 MySQL基本查询

insert into 表名 (要插入数据的列) values(数据);下面我们先创建一个students表。然后我们向表中插入数据。如果我们不指定要插入数据的列,那么就是全列插入,即我们需要为每一列都输入数据。如果我们指定了要插入数据的列,那么只需输入指定列数据即可。我们还可以进行多行插入,每一行数据之间使用逗号分割开。

2024-01-14 16:31:46 1666

原创 MySQL表的约束

前面我们在学习数据库知识时,知道了当我们向数据库中插入数据时,如果数据不合法,那么MySQL不会允许数据插入成功,这也算是MySQL对数据合法性的一种约束。但是仅仅靠这一种约束是不够的。虽然真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。

2024-01-13 19:18:30 1080

原创 数据库的数据类型

下面我们来创建一个表,表中创建一个tinyint类型的数据。当我们不指定tinyint为无符号类型时,tinyint默认为有符号类型整数。在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的下面我们向表中插入数据。我们看到当向表中插入tinyint范围内的数据时,可以成功插入。当插入的数据不在tinyint时,会直接插入失败。下面我们创建一个表t2,该表中的tinyint类型为无符号整型。

2024-01-13 15:23:02 1608

原创 c++智能指针

下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析Func函数中的问题。下面的代码中会因为异常的抛出而造成内存泄漏。例如如果在p2的new中抛出异常,那么会直接跳到异常的处理catch的代码块中,这样就没有执行Func函数中的delete p1来释放p1的内存了。而如果在div()函数中抛出异常,那么不会执行delete p1和delete p2,这样就造成了p1和p2的内存泄漏。throw "除0错误";

2024-01-12 19:14:10 1577

原创 数据库和表的操作

大写的表示关键字[] 是可选项CHARACTER SET: 指定数据库采用的字符集COLLATE: 指定数据库字符集的校验规则我们看到创建一个目录后,Linux的/var/lib/mysql下也会出现对应的目录。我们也可以在创建数据库时进行判断,如果当前数据库已存在,那么就不再创建。我们还可以在创建数据库时,指定这个数据库的字符集和校验规则。下面为创建一个使用utf8字符集的数据库。使用下面的两种方式都可以指定数据库的字符集。

2024-01-12 16:28:52 1127

原创 数据库基础

mysql本质就是一个基于C(mysql)S(mysqld)模式的一种网络服务。mysql本质上是一个网络服务。我们可以看到mysql的连接。存储数据用文件就可以了,为什么还要弄个数据库?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库。数据库本质就是对数据内容存储和查询数据的一套解决方案。

2024-01-11 19:37:38 947

原创 c++异常

终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。

2024-01-11 14:30:02 891

原创 初识 Qt

命名规范类名:首字母大写,单词和单词之间首字面大写。函数名,变量名称:首字母小写,单词和单词之间首字母大写。快捷键注释:ctrl + /运行:ctrl + r编译:ctrl + b字体缩放:ctrl + 鼠标滑轮查找:ctrl + f整行移动:ctrl + shift + 上箭头或下箭头自动对齐:ctrl + i同名之间的.h和.cpp文件切换:F4帮助文档第一种方式:F1帮助文档第二种方式:左侧按键帮助文档第三种方式:在安装路径下找下面我们来自定义信号和槽函数。

2024-01-11 13:57:35 1149

原创 C++11

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

2024-01-06 20:06:52 1206 1

原创 UDP协议与TCP协议

所谓的端口,就好像是门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端是有很多端口的,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号。端口号(Port)标识了一个主机上进行通信的不同的应用程序。在TCP/IP协议中, 用 “源IP”, “源端口号”, “目的IP”, “目的端口号”, “协议号” 这样一个五元组来标识一个通信(可以通过netstat -n查看)。

2023-12-27 11:12:13 1680

原创 HTTPS协议

下面这个图为http和https的关系。HTTPS协议也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层。我们在学习http协议时,也分析了http协议中传输数据都是明文传输,所以是不安全的,所以才会有了https协议,https协议会将http协议发送到网络中的数据先进行加密,然后再收到数据时再进行解密,这样在网络中传输的数据就是经过加密后形成的密文,这些数据就不是以明文的方式传输了。要了解HTTPS协议,我们就需要先了解加密和解密。加密就是把明文(要传输的信息)进行一系列变换,生成密文。

2023-12-22 13:44:35 902

原创 HTTP协议

平时我们说的一个网站的网址,其实就是说的URL。下面我们来分析一个网站的url。URL是统一资源定位器,即根据URL就可以定位互联网中唯一的一个资源。

2023-12-21 12:36:28 1051

原创 c++内存池项目

下面我们来实现项目的ThreadCache部分。我们将ThreadCache类的成员函数的声明和定义分别写到ThreadCache.h和ThreadCache.cc文件中。然后我们在Common.h文件中实现一些共用的类或函数。我们实现ThreadCache的初步思想和定长内存池类似,只不过内存池中申请的内存块不再是定长的,而是有可能为1、2、4、8、9、10…等字节的内存块,所以这些申请的内存块释放时,我们就不能挂载到同一个链表上,所以我们采用哈希桶类似的数据结构来管理这些大小不一的被释放的内存块。

2023-12-21 12:24:56 1265

原创 linux网络版计算机

协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端。约定方案一:客户端发送一个形如"1+1"的字符串;这个字符串中有两个操作数, 都是整形;两个数字之间会有一个字符是运算符, 运算符只能是 +;数字和运算符之间没有空格;

2023-12-19 10:32:05 920

原创 linux网络编程套接字

文章目录一、预备知识1、IP地址和MAC地址二、简单的UDP网络程序在windows系统下运行客户端程序三、简单的TCP网络程序一、预备知识1、IP地址和MAC地址IP地址IP协议有两个版本, IPv4和IPv6. 我们整个的课程, 凡是提到IP协议, 没有特殊说明的, 默认都是指IPv4IP地址是在IP协议中, 用来标识网络中不同主机的地址;对于IPv4来说, IP地址是一个4字节, 32位的整数;我们通常也使用 “点分十进制” 的字符串表示IP地址, 例如 192.168.0.1 ; 用

2023-12-16 13:19:08 880

原创 c++-定长内存池

我们知道申请内存使用的是malloc,malloc其实就是一个通用的申请函数,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定长内存池。定长内存池的特点就是每次都申请固定大小的内存,这样做的话就可以使性能达到极致,并且不需要考虑内存碎片等问题。我们在定长内存池类中创建一个 _memory来指向申请的大块内存。然后设置一个 _freeList指针来存还回来的内存块。再设置一个 _remainBytes来记录申请的大块内存的剩余空间。

2023-12-07 15:46:22 1086

原创 linux线程池

一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。需要大量的线程来完成任务,且完成任务的时间比较短。WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。

2023-12-04 13:26:52 1044

原创 c++-哈希

在学习哈希之前,我们先来学习四个c++11中新添加的两个容器。我们知道在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2Nlog_2 Nlog2​N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。

2023-11-13 17:24:42 240

原创 linux线程

在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。下面我们先来看一下之前我们学习的进程地址空间。

2023-11-13 17:23:46 293

原创 c++-红黑树

红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。所以红黑树不是严格平衡的,只是近似平衡。下面我们来使用代码定义红黑树的结点。红黑树的结点定义和AVL树结点的定义类似,只不过AVL树中使用平衡因子来严格控制平衡,而红黑树中使用颜色来控制本身近似为平衡树。思考:在结点的定义中,为什么要将结点的默认颜色给成红色的?

2023-11-06 19:41:13 350

原创 linux进程信号

你在网上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”。当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取”。在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。

2023-11-02 21:14:49 168

原创 c++-AVL树

前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。

2023-11-02 21:12:36 359

原创 c++-set和map

在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。

2023-10-31 15:25:02 203

原创 c++-二叉树进阶

二叉搜索树(BST,Binary Search Tree),又称二叉排序树或二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树:(1). 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。(2). 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。(3). 它的左右子树也分别为二叉搜索树。

2023-10-30 12:05:58 476

原创 linux进程间通信

当程序为单进程时,那么也就无法使用并发能力,就更加无法实现多进程协同了。而要是想要程序变为多进程的话,那么各个进程之间需要传输数据、同步执行流、消息通知等。所以进程间通信的目的就是解决这些问题。数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

2023-10-27 17:39:08 408

原创 c++中的多态

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。例如买票,学生买票是半价,成年人买票是全价,老人和小孩买票是半价。多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

2023-10-24 22:29:11 277

原创 c++中的继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。下面我们看到的Person是父类,也称作基类。Student是子类,也称作派生类。1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。

2023-10-21 15:12:10 209

原创 linux基础IO

经过前面的学习,我们知道了文件 = 文件内容 + 属性(也是数据),所以当我们创建了一个文件并没有给里面写内容时,此时该文件也占有了空间,因为文件的属性也需要空间来存储。所以我们对文件的所有操作就是:(1). 对内容。(2). 对属性。通过上面对文件类系统调用接口的使用,我们发现了这些接口都离不开一个变量,即open系统调用的返回值fd,那么这个fd是什么呢?通过上面的使用我们可以知道close、write、read接口就是靠这个fd来找到要操作的文件,其实这个fd就是文件描述符。

2023-10-21 11:43:47 404

空空如也

空空如也

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

TA关注的人

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