自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++】线程池

线程池是一种管理线程使用的模式,尽管线程数量过多可能会增加调度成本,从而影响缓存的局部性和整体性能。线程池通过维护多个线程,准备好分配并行执行的任务,避免了短时任务处理中线程的创建和销毁成本。线程池不仅确保了内核资源的充分使用,还避免了过度调度。合理的线程数量应根据可用的并行处理器、处理器核心、内存和网络套接字等资源来确定。

2024-05-11 10:47:04 246

原创 生产者消费者模型

生产者消费者模式是通过一个容器来解决生产者与消费者之间的强耦合关系,两者之间没有直接的关系,不直接通讯,通过阻塞队列来进行通讯,这样生产者就不用等待消费者来消费,消费者有不要用等待生产者生产。生产者生产完数据直接添加到阻塞队列里面,消费者直接去阻塞队列拿数据。这样阻塞队列就相当于一个缓冲区。平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。1.解耦合2.支持忙闲不均3.支持并发。

2024-05-10 13:46:31 529

原创 【Linux】Linux线程

1.一个进程的一个执行线路叫做线程,线程的一个进程内部的控制序列。2.一个进程至少有一个执行线程3.线程在进程内部,本质是在进程地址空间内运行4.操作系统将进程虚拟地址空间的资源分配给每个执行流,就成了线程执行流。

2024-05-07 22:26:56 1053 1

原创 【C++】C++的四种类型转换

static_cast、reinterpret_cast、const_cast、dynamic_cast

2024-04-23 14:13:23 480

原创 搜索引擎项目

我们上网会浏览很多网站,但是有些网站并没有搜索功能。因此就需要一个搜索引擎来改善网站用户体验、提高信息检索效率等。这里已boost库的网站为例,boost库没有搜索功能,可以自己写一个搜索引擎。

2024-03-22 09:41:25 2385

原创 【Linux】编译动态库与静态库

静态库(.a):程序会在编译链接的时候把代码链接到可执行文件中,程序在运行的时候不再需要静态库。动态库(.lib):程序在运行的时候才链接库,所以一个动态库可以被多个程序共享。链接动态库仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。在可执行程序运行时外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个 过程称为动态链接(dynamic linking)。动态库采用链接的方式,从而可以让可执行文件更小,节约了磁盘空间。

2024-03-13 17:06:34 356

原创 【C++】智能指针

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内 存、文件句柄、网络连接、互斥量等等)的简单技术。当我们把管理一份资源的责任交给一个对象,就不需要自己显示是释放资源,使用这种方式可以让对象所需资源在其生命周期内都有效。就是在对象构造的时候获取资源,然后让对象需要的资源在它的生命周期内都有效,在对象析构的时候把资源释放。举一个简单的例子:1.2 智能指针的原理比如上面那个smartptr的例子,智能指针需要重载*

2023-12-31 15:21:21 1988

原创 【C++】C++11

本篇文章将介绍c++11的部分新功能。

2023-12-26 18:58:38 939

原创 【C++】异常

很多公司都会定义自己的自定义异常体系方便管理异常,让大家抛出的异常都是继承的派生类对象,这样就只要捕获基类。

2023-12-11 17:09:32 689

原创 【C++】位图、布隆过滤器

先看例题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。1.遍历,时间复杂度O(N)2.排序+二分查找3位图:数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一 个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在。位图的概念:位图就是用一个比特位来表示一种状态,适用于海量数据,通常是数据不重复的情况下来判断数据在不在。

2023-12-10 14:42:37 490

原创 【C++】哈希、unordered_map/unordered_set

在c++11中,STL新提供了4个unordered系列的关联式容器,用于应对红黑树节点太多导致的查询效率不理想的问题,新增的容器使用方法与红黑树结构的关联式容器基本相同,只是底层结构不同。

2023-12-09 17:03:13 779

原创 【Linux】进程替换以及实现简易shell

在使用fork()函数创建子进程后,子进程往往需要使用exec函数将程序进行替换,已执行另一个程序,当进程调用exec函数时,该进程的程序代码以及数据将完全被新程序替换。从新程序的启动开始执行,调用exec函数不会创建子进程,因为调用exec函数前后该进程的pid没有发生变化。

2023-12-06 20:08:24 311

原创 【数据结构】红黑树&&模拟实现STL中的map与set

我这里就搞个枚举来表示红黑树的颜色enum ColorRED,BLACK,_kv(kv),_col(RED){}这里解释一下为什么节点的颜色默认要给成红色因为在插入的时候如果父节点是黑色,就可以直接结束。父节点是红色只需要向上调整当前节点和临近节点。如果默认给成黑色,不管父节点是什么颜色都需要调整,一整颗树,确保每条路径的黑色节点数量都相同。

2023-11-20 17:38:59 90

原创 【数据结构】AVL树

/左节点//右节点//双亲节点int _bf;//平衡因子, _kv(kv),_bf(0){}

2023-11-20 15:15:33 48

原创 【C++】map与set的使用

1.set是按照一定次序存储元素的容器。2在set内value总是唯一的。set内的值都是被const修饰的,不能修改但可以通过insert和erase进行插入删除。3.在set内部,总是按照内部元素比较,按照升序排列。4.set容器在通过key访问单个元素时,其访问效率不如比unordered_set容器。但是set可以根据顺序对子集进行直接迭代。5.set的底层是由红黑树实现的。

2023-11-07 10:39:37 55

原创 【Linux】进程的创建、终止、等待

fork()函数在Linux中是很重要的函数,他可以在已有进程中创建一个新的进程,新进程为子进程,原进程为父进程返回值:给子进程返回0,给父进程返回子进程的PID,出错返回-1.进程调用fork()时,当控制转到内核中的fork代码时,内核干了以下几件事:1.分配新的内核块和内核数据结构给子进程2.将父进程的部分数据结构内容拷贝给子进程3.将子进程添加到系统进程列表中4.fork返回,开始调度器调度。

2023-11-03 19:47:28 74

原创 【数据结构】搜索二叉树

搜索二叉树又叫排序二叉树,搜索二叉树可以为空,如果不为空应满足以下条件。若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。

2023-11-03 11:16:54 56

原创 【C++】多态

多态是在不同继承关系的类对象,去调用同一函数而产生不同的行为在虚函数后面加上=0,这个函数就是纯虚函数,包括纯虚函数的类叫抽象类(接口类),抽象类不能实例化出对象。就算派生类继承了基类在没重写纯虚函数时也不能实例化出对象,只有派生类重写了纯虚函数才能实例化出对象。public:public:cout

2023-11-02 20:38:40 49

原创 【C++】继承

继承与访问限定符都分别有以下方式public(公有)protected(保护)private(私有)1. 基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私 有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在类里面还是类外面 都不能去访问它。2. 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在 派生类中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。

2023-11-01 20:55:18 70

原创 【C++】模版进阶

模版参数分为类型模版参数和非类型模板参数类型模版参数就是在定义模版时出现class或者typename之类的类型模版参数名称非类型模版参数就是使用一个常量作为模版参数,可以把这个模版参数当成常量来使用。注意:1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。

2023-10-07 21:04:38 74

原创 [C++]优先级队列priority_queue

1.优先级对列是一种容器适配器,它根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2.优先级队列的底层类似于堆,可以随时插入元素,并且只能位于优先级队列顶部的元素。3.优先级队列被实现为容器适配器,这个容器适配器使用特定的容器类作为其底层的容器类,并且提供一系列的成员函数来访问其元素。4.常用成员函数empty():检测容器是否为空size():返回容器中有效元素个数front():返回容器中第一个元素的引用push_back():在容器尾部插入元素。

2023-10-07 15:44:58 47

原创 Linux开发工具 Vim、gcc/g++、gbd、make/Makefile

vim中有很多模块,可以在vim的底行模式使用help vim-modes命令来查看vim中所有的模式。

2023-10-06 13:58:24 142 1

原创 [Linux]权限

1.目录的可执行权限表示你是否能在这个目录下执行命令2.如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这 个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)3.而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读 权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-09-28 18:46:47 57

原创 【C++】list

list的底层的双向链表,在节点中通过指针指向其前一个元素和后一个元素。所以是可以在常数范围内在任意位置进行插入和删除的序列式容器。list和(array,vector,deque)相比list通常在任意位置进行插入、移除元素的执行效率更高。

2023-08-22 19:50:16 112 1

原创 【C++】vector

vector是表示可变大小数组的序列容器,它的大小会被容器自动处理,以一种有效的方式动态增长.

2023-08-21 21:13:41 70 1

原创 【C++】string类

(constructor) 函数名称 功能说明string() 构造空的string类对象 即空字符串string(const char* s) 用C-string来构造string类对象。

2023-08-20 17:59:50 64 1

原创 【C++】模版

我们如果要实现一个通用的交换函数是可以用函数重载的但是函数重载代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数,也很容易出错。

2023-08-19 10:00:26 34

原创 [C/C++]内存管理

new和delete能够对自定义类型自动调用构造函数和析构函数class Apublic:A(int a):_a(a)~A()private:int _a;运行结果:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与 free不会。new的原理1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造delete的原理。

2023-08-17 22:04:32 58 1

原创 【C++】初始化列表、static成员、友元、内部类

创建对象时,编译器会自动调用构造函数,给每个成员一个合适的初始值。上面的构造函数的调用后,只能说给每个成员变量赋值了,并不能称为初始化,在构造函数的函数体内只能称之为赋值,赋值是可多次赋值的,初始化只能一次。

2023-08-11 22:34:52 167 1

原创 【C++】拷贝构造函数、 赋值运算符重载

size = 0;//拷贝构造return;return;_a = tmp;_size++;_a = NULL;_size = 0;return 0;

2023-08-06 16:43:26 484

原创 【C++】内联函数、函数重载、类

使用aoto关键字修饰变量,会作为新的类型指示符来指示编译器,编译器会在编译时自动推导出变量的类型。比如:注意点:在使用auto关键字定义变量时必须要对变量初始化,auto不是一种类型的声明,只是一个类型声明时的占位符,编译器在编译的时候会替换成对应类型。用auto在一行定义多个变量时,这些变量的类型必须相同。public://Stack()//{//}//{//}//编译器自动生成构造函数private:int _Top;

2023-08-03 22:00:54 61

原创 【C++】C语言过渡到C++

命名空间以namespace为关键字开头,后面跟命名空间的名字变量,函数,自定义类型int data;int data;int x = 0;int data;int data;使用命名空间有3种方式。

2023-07-31 20:23:20 46

原创 【C语言】快速排序+归并排序+计数排序

快速排序是一种二叉树交换结构的排序法,首先取序列中的某个元素作为基准值,用这个基准值把整个序列分割成两个序列。例如升序就是把小于基准值的元素放在左子序列,大于基准值的数放在右子序列,最后左右子序列重复这个过程直到完成排序。当递归到每个序列只有一个元素时,我们称之为序列有序就开始归并,搞一个临时数组,把两个有序序列合成一个有序序列。为了防止序列最小值为100或者10000,造成开数组时的空间浪费,可以先遍历一次要排序的序列找出序列最小的元素,所有元素在技术时减去这个最小值,还原序列时再加回来。

2023-07-24 22:43:00 203

原创 【C语言】插入排序+希尔排序

直接插入排序是一种简单的插入排序方式,它的基本思想是:把没有排序的数据按照它值的大小依次插入到已经排序过的序列中,一直到所有数据都排序完,生成一个新的系列。比如说在玩斗地主时的发牌场景,玩家会按照拿到手的牌去判断这张牌应该放在什么位置。

2023-06-26 21:54:42 38

原创 【数据结构】栈与队列

首先typedef一下数据类型,方便修改,使用动态数组来实现,top表示栈顶,capacity表示空间大小。QNode是队列的单个节点,里面存储数据和下一个节点的指针Queue是整个队列,里面存放队列的头,尾和数据个数。}QNode;int size;}Queue;下面是要实现的操作。

2023-05-23 21:29:27 32 1

原创 【数据结构】带头双向循环链表

带头双向循环链表:在链表中结构最复杂,单独存储数据基本都是用这个结构,这个结构虽然最复杂,但这种复杂也为我们带来了很多优势,让使用者可以很方便的访问前驱和后继节点。如下图:每个节点由前驱指针,后继指针和数据组成。

2023-05-22 21:09:29 29

原创 【C语言】程序环境和预处理

_FILE__ //进行编译的源文件__LINE__ //文件当前的行号__DATE__ //文件被编译的日期__TIME__ //文件被编译的时间__STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义使用预定义符号就可以打印出文件名,行号,日期,时间但是__STDC__能否被识别取决于编译器。可以看到在预编译阶段已经把#define定义的标识符替换了。因为#define是替换,所以如果在末尾加上了分号(;)那么分号也会被替换到代码中去。

2023-04-09 12:26:22 84

原创 【C语言】文件操作

磁盘上的文件是文件。但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

2023-04-07 18:40:33 49

原创 【C语言】自定义类型详解

结构体,枚举,联合体的介绍

2023-03-26 17:24:50 1988

原创 【C语言库函数】memcpy,memmove的使用和模拟实现

【C语言库函数】memcpy,memmove的使用和模拟实现

2023-03-26 11:53:08 90

空空如也

空空如也

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

TA关注的人

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