自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++总复习

宏就是将参数 插入到文本之中。

2025-06-06 20:56:12 998

原创 关于linux

cat,less(可翻页),grepman,find: 用于在文件树中查找文件,并作出相应的处理。

2025-05-18 17:44:24 886

原创 mysql 复习

数据库是按照数据结构来数据的仓库,方便我们增删查改。MySQL有客户端和服务器端,基于网络服务的,3306端口处于监听状态。数据库服务器、数据库和表的关系如下:MySQL的架构设计如下:引擎层:由多种可拔插的存储引擎共同组成,取。通过show engines语句可以查看MySQL支持的存储引擎,其中MySQL底层默认使用的,该存储引擎支持事务、行级锁、外键等。

2025-05-08 17:11:42 1066

原创 C++复习3---C++11

一切类型都可以用{}去初始化。

2025-05-08 13:45:04 719

原创 C++复习--线程互斥量智能指针

异常类的成员变量不能设置为私有,因为私有成员在子类中是不可见的,基类Exception中的what成员函数最好定义为虚函数,方便子类对其进行重写,从而达到多态的效果。unique_ptr是C++11中引入的智能指针,unique_ptr通过防拷贝的方式解决智能指针的拷贝问题,也就是简单粗暴的防止对智能指针对象进行拷贝,这样也能保证资源不会被多次释放。当线程函数的参数类型为引用类型时,如果要想线程函数形参引用的是外部传入的实参,而不是线程栈空间中的拷贝,那么在传入实参时需要借助ref函数保持对实参的引用。

2025-05-07 20:43:26 985

原创 C++复习--set,map 哈希,单例

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时的效率可达到O ( l o g N ) O(logN)O(logN),即最差情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也不理想。设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数:H a s h ( K e y ) = K e y % p ( p < = m ) Hash(Key)=Key\%p(p<=m)Hash(Key)=Key%p(p<=m),将关键码转换成哈希地址。

2025-05-06 19:02:56 998

原创 C++复习

reserve和resize通过reserse函数改变容器的最大容量,resize函数改变容器中的有效元素个数。1、当所给值大于容器当前的capacity时,将capacity扩大到该值。2、当所给值小于容器当前的capacity时,什么也不做。1、当所给值大于容器当前的size时,将size扩大到该值,扩大的元素为第二个所给值,若未给出,则默认为0。2、当所给值小于容器当前的size时,将size缩小到该值。

2025-05-06 14:58:46 870

原创 Linux网络编程

3位片偏移(framegament offset):分片相对于原始数据开始处的偏移,表示当前分片在原数据中的偏移位置,实际偏移的字节数是这个值× 8 \times 8×8得到的。因此除了最后一个报文之外,其他报文的长度必须是8的整数倍,否则报文就不连续了。

2025-04-25 17:26:07 691

原创 linux复习

此时每当我们申请一个IPC资源,就在该数组当中开辟一个这样的结构。会话与服务建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意多个后台进程组。如果我们再xshell连接服务器终端,终端将会有一个控制进程,当我们断开连接时,服务器终端上的控制进程会收到一号信号SIGHUP而终止控制进程。守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程,

2025-04-22 20:53:20 1345

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

这是本人写的第二个项目,相比第一个代码量更少一些,但是此项目涉及linux中的内容更多,同样是干货满满,实现了。

2025-04-21 11:09:52 992

原创 基于websocketpp实现的五子棋项目

C++网站在线对战五子棋项目

2025-03-24 15:51:59 930

原创 C++11 ——— 线程库

此外,如果调用的是wait_for或wait_until函数的第二个版本的接口,那么当线程被唤醒后还需要调用传入的可调用对象,如果可调用对象的返回值为false,那么当前线程还需要继续被阻塞。当线程函数的参数类型为引用类型时,如果要想线程函数形参引用的是外部传入的实参,而不是线程栈空间中的拷贝,那么在传入实参时需要借助ref函数保持对实参的引用。线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其。

2024-12-04 20:51:45 779

原创 C++特殊类设计

new和delete默认调用的是全局的operator new函数和operator delete函数,但如果一个类重载了专属的operator new函数和operator delete函数,那么new和delete就会调用这个专属的函数。将该类的构造函数设置为私有即可,因为子类的构造函数被调用时,必须调用父类的构造函数初始化父类的那一部分成员,但父类的私有成员在子类当中是不可见的,所以。函数,因此直接将该类的拷贝构造函数和赋值运算符重载函数设置为私有,或者用C++11的方式将这两个函数删除即可。

2024-12-02 20:25:42 830

原创 C++的类型转换

而使用dynamic_cast进行向下转型则是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。其中,向上转型就是所说的切割/切片,是语法天然支持的,不需要进行转换,而向下转型是语法不支持的,需要进行强制类型转换。

2024-12-02 11:10:37 915

原创 C++的IO流

在C语言中,我们若是想要将一个整型变量的数据转化为字符串格式,有以下两种方法:1、使用itoa函数进行转化。int a = 10;//将整型的a转化为十进制字符数字存储在字符串arr当中2、使用sprintf函数进行转化。int a = 10;//将整型的a转化为字符串格式存储在字符串arr当中虽然itoa函数和sprintf函数都能完成转化,但是在两个函数在转化时,都需要先给出保存结果的空间,而空间的大小是不太好界定的,除此之外,转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。

2024-11-29 11:52:34 820

原创 C++智能指针

内存泄露问题内存泄露是指因为疏忽或错误,造成程序未能释放已经不再使用的内存的情况。执行上述代码时,如果用户输入的除数为0,那么div中就会抛出异常,这时程序的执行流会直接跳转到主函数中的catch块中执行,最终导致func函数中申请的内存资源没有得到释放。利用异常的重新捕获解决对于这种情况,我们可以在func函数中先对div函数中抛出的异常进行捕获,捕获后先将之前申请的内存资源释放,然后再将异常重新抛出。利用智能指针解决上述问题也可以使用智能指针进行解决。

2024-11-28 20:29:43 707

原创 C++异常

实际中很多公司都会自定义自己的异常体系进行规范的异常管理。公司中的项目一般会进行模块划分,让不同的程序员或小组完成不同的模块,如果不对抛异常这件事进行规范,那么负责最外层捕获异常的程序员就非常难受了,因为他需要捕获大家抛出的各种类型的异常对象。因此实际中都会定义一套继承的规范体系,先定义一个最基础的异常类,所有人抛出的异常对象都必须是继承于该异常类的派生类对象,因为异常语法规定可以用基类捕获抛出的派生类对象,因此最外层就只需捕获基类就行了。

2024-11-28 09:16:38 689

原创 Linux线程安全

上篇博客我们谈到了线程概念,线程与进程,线程控制以及线程地址空间等问题,这篇博客我们继续介绍线程的话题。

2024-11-25 11:41:40 920

原创 C++11-- 05(lambda和包装器)

function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。Ret:被包装的可调用对象的返回值类型。Args...:被包装的可调用对象的形参类型。function包装器可以对可调用对象进行包装,包括函数指针(函数名)、仿函数(函数对象)、lambda表达式、类的成员函数。// function本质就是一个类模板public:class Pluspublic:int main()//包装函数指针(函数名称)

2024-11-22 18:12:32 727

原创 C++11(4) ——可变参数模板

函数的可变参数模板定义方式如下:返回类型 函数名(Args… args)//函数体{}模板参数Args前面有省略号,代表它是一个可变模板参数,我们把带省略号的参数称为参数包,参数包里面可以包含0到N ( N ≥ 0 ) 个模板参数,而args则是一个函数形参参数包。现在调用ShowList函数时就可以传入任意多个参数了,并且这些参数可以是不同类型的。return 0;我们可以在函数模板中通过sizeof计算参数包中参数的个数。

2024-11-18 20:55:44 655

原创 C++11 (3)——类的新功能

上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。要验证默认生成的移动构造和移动赋值确实做了上述工作,这里需要模拟实现一个简化版的string类,类当中只编写了几个我们需要用到的成员函数。如果我们自己实现了移动构造或者移动赋值,就算没有实现拷贝构造和拷贝赋值,编译器也不会生成默认的拷贝构造和拷贝赋值。

2024-11-18 17:07:04 762

原创 C++11(2)右值引用和移动语义

由于PerfectForward函数的参数类型是万能引用,因此既可以接收左值也可以接收右值,而我们在PerfectForward函数中调用Func函数,就是希望调用PerfectForward函数时传入左值、右值、const左值、const右值,能够匹配到对应版本的Func函数。经过完美转发后,调用PerfectForward函数时传入的是右值就会匹配到右值引用版本的Func函数,传入的是const右值就会匹配到const右值引用版本的Func函数,这就是完美转发的价值。

2024-11-18 16:31:10 981

原创 C++11新特性(1)

这样就可能会带来一些问题,因为0既能表示指针常量,又能表示整型常量。所以出于清晰和安全的角度考虑,C++11中新增了关键字nullptr,用于表示空指针。在大部分情况下使用NULL不会存在什么问题,但是在某些极端场景下就可能会导致匹配错误。

2024-11-17 20:33:36 1060

原创 位图和布隆过滤

现在要找到出现次数最多的IP地址,就可以分别将各个小文件加载到内存中, 然后用一个map<string, int>容器统计出每个小文件中各个IP地址出现的次数,然后比对各个小文件中出现次数最多的IP地址,最终就能够得到log file中出现次数最多的IP地址。

2024-11-15 15:51:53 694

原创 Linux多线程

什么是线程?在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行,本质是在进程地址空间内运行。在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更轻量化。透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。在Linux中,站在CPU的角度,能否识别当前调度的task_struct是进程还是线程?

2024-11-10 17:01:42 942

原创 哈希表与unordered_map

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。搜索的效率取决于搜索过程中元素的比较次数,因此顺序结构中查找的时间复杂度O(N),平衡树中查找的时间复杂度为树的高度O ( l o g N )。而最理想的搜索方法是,可以不经过任何比较,一次直接从表中得到要搜索的元素,即查找的时间复杂度为O(1)。如果构造一种存储结构,该结构。

2024-11-07 11:15:48 710

原创 Linux信号

信号时Linux系统提供的一种让用户(进程)之间发送异步信息的方式。用户输入命令,在Shell下启动一个前台进程。用户按下Ctrl-C,,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程,前台进程因为收到信号,进而引起进程退出一个命令后面加个&可以放到后台运行,Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。

2024-11-03 17:13:42 1120

原创 进程与文件

学计算机的应该第一课都会介绍冯诺依曼体系结构,这套结构包含了计算机所涉及的所有硬件,以及各个硬件之间的信息和信号交互。如下:我们发现,计算机数据信号的交互过程,必须要经过内存。因此外设(磁盘数据,网络中的数据)的所有数据信号,必须先到内存,才能到cpu执行,而执行完的结果,也要通过内存,再输出到屏幕,磁盘等外设中。那么谁来控制这些数据的流动,是操作系统。

2024-10-31 16:20:21 1059

原创 算法2(C++实现)

给一个数字n,确定它的二进制表示第x位是0还是1:(n>>x)&1给一个数字n,确定它的二进制表示第x位修改成1:n=n|(1<<x)或者:n=n^(1<<x)n&(-n) 这是lowbit操作将一个数字n最右侧的1变成0:n&(n-1)位图的思想:类似于一个hash数组,数组的每一处存储的不同值有着相关信息,位图则利用一个32位置的 int,它的每一个bit位都存储着相关信息异或^ 考察最多(5.3 5.4 5.5 5.6),a^0=a , a^a=0, a^b^c=a^(b^c)

2024-10-31 16:05:21 938

原创 红黑树(C++实现)

本篇博客讲解红黑树概念,性质,以及插入的原理,

2024-10-29 10:45:21 573

原创 算法(C++实现)

从现在开始,开辟一个新的专题----算法,这篇文章介绍双指针,滑动窗口,二分查找这几种算法以及附有相应的练习题。

2024-10-14 19:41:47 1003

原创 C++----多态

虚函数:即被virtual修饰的类成员函数称为虚函数。public:virtual void BuyTicket() { cout << "买票-全价" << endl;

2024-08-06 16:19:48 603

原创 C++---继承

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。// 学号。

2024-07-31 16:59:50 954

原创 C++ ---模板进阶

模板参数分类类型形参与非类型形参。类型形参 :出现在模板参数列表中,跟在class或者typename之后的那个参数类型名称。

2024-07-17 19:17:50 542

原创 stack和queue

1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用。

2024-06-25 19:38:01 920

原创 STL容器--list

1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。

2024-06-03 20:22:18 1630

原创 C++----Vector容器

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

2024-05-26 15:18:53 873

原创 string类详解

1. string是表示字符串的字符串类2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;4. 不能操作多字节或者变长字符的序列。在使用string类时,必须包含#include头文件以及using namespace std;

2024-01-02 09:21:05 1958

原创 C++模板和STL简介

class 类模板名// 类内成员定义使用示例:Vector// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0)// 使用析构函数演示:在类中声明,在类外定义。~Vector();注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)标准模板库):是C++标准库的重要组成部分。

2023-12-17 21:08:02 918 2

原创 C/C++内存管理

new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造delete的原理1. 在空间上执行析构函数,完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间new T[N]的原理1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间申请2. 在申请的空间上执行N次构造函数。

2023-12-17 18:07:48 1003

空空如也

空空如也

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

TA关注的人

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