- 博客(65)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 【项目】基于TCP的聊天系统
本片文章将给你一个思路,加上一点启发,助力你实现自己的基于TCP的聊天系统。实现本项目后,你将对于多线程,生产者消费者模型,安全队列,数据库的操作更上一步。
2022-08-09 20:42:31
1993
原创 带你手把手实现Huffman压缩
文件压缩是我们日常所用运最广泛的应用了,但是你是否好奇它是如何实现文件压缩,又如何解压。这篇文章将带你撩开文件压缩的神秘面纱,带你实现一个基于huffman编码最简单的文件压缩项目。看到这里有Huffman编码不要怕,Huffman编码其实很简单。...
2022-07-10 10:21:00
2971
4
原创 最简单的红黑树模拟实现
众所周知红黑树是map和set的底层容器,它比AVL树的插入速率更高,且有序。这篇文章将带你手撕红黑树。并以红黑树为底层容器实现模拟实现map和set。
2022-07-07 15:52:05
1094
4
原创 【C++】浅谈C++中的auto和decltype
目录1. auto1.1 对于auto的一些使用规则2. decltype2.1 decltype返回值类型追踪对于上面的这两种情况我们可以用auto和decltype来解决:运行结果:下面我们来具体介绍auto和decltype 1.对于用auto修饰的变量一定要初始化运行结果:可以看到auto可以自动识别变量的类型2. 注意auto是不可以作为函数的参数和返回值的这是因为用auto修饰的变量必须要初始化,这样才能在编译阶段推断出变量的类型,而函数的参数和返回值在程序运行阶段才能确定,
2022-07-04 10:05:30
1460
1
原创 【C++11】用列表初始化你的vector&&initializer_list简介
对C++11中新增的列表初始化容器方法详细解析,浅谈initializer_list
2022-07-03 20:05:04
3231
原创 【C++】C++中的类型转换
标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast、dynamic_cast本文将向你详细的介绍他们的用途和使用方式。
2022-07-03 15:42:21
862
原创 【C++】智能指针
引言:对于程序员来说内存泄露是一个非常头痛的问题,一旦代码量大了之后内存泄漏是很难被检测出来的,还有许多十分隐蔽的内存泄漏是我们根本无法考虑到的。例如在释放内存之前的程序就崩溃,像这种隐蔽的错误我们一般根本是发现不了的,这一点我们的STL库怎么会想不到呢?所以STL库给我们提供了多种自动释放资源的智能指针,但是这其中也有许多的坑,本片文章将带你搞定智能指针以及其中的众多坑!!!...
2022-07-02 23:25:24
670
1
原创 布隆过滤器:
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑型的(紧凑型的是指用位图进行实现)、比较巧妙的概率型(概率是指他不是一定准确的这一点我们在下面对其详细介绍中会提到)数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。.........
2022-06-27 21:17:41
338
原创 什么是哈希?哈希的模拟实现
这篇文章将带你从小白的角度逐步理解哈希的概念,哈希中的问题,以及解决方式,最终将带你实现个自己的哈希数据结构。还不快进来看!!!
2022-06-07 00:05:02
3793
8
原创 手撕AVL树谁看谁撕。看了之后你到时候撕给面试官看。
目录1.AVL树的概念2.一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:3.AVL树的节点4.AvL树的插入1. 按照二叉搜索树的方式插入新节点2. 调整节点的平衡因子2.1.右单旋2.2.左单旋2.3. 左右双旋2.4.右左双旋5.AVL树检测:6.AVL树的性能7.最后附上AVL树的全部代码:因为马上期末考试了/(ㄒoㄒ)/,所以只写了AVL树的插入详细解法,但质量绝对保证包看包会,等期末之后更新AVL树的删除操作!!! 好啦看到这里相信AVL树的插入已经是小case了,等期末考试之后必
2022-06-03 19:17:40
335
3
原创 【C++】之多态最最最详细讲
目录 1.什么是多态? 2.多态的分类 2.1.静态多态(也可以称为:静态绑定||早绑定) 2.2.动态多态(也可以称为:动态绑定||晚绑定) 3.C++中动态多态的实现条件 4.多态的体现 5.什么是重写 测试各种情况下是否构成重写: 大总结一下构成重写的具体需求。 重载,重写,重定义三个概念的区分 6.override关键字: 7.final关键字 final使用需要注意的点: 8.抽象类 8.1.抽象类的意义 8.2.纯虚函数要注意的..
2022-05-21 23:01:57
844
3
原创 Linux线程安全篇之---生产者与消费者模型(大厂业务必备知识)
目录1.生产者和消费者模型:1.1、123规则:1.2、应用场景:1.3、优点:1.4、代码模拟:1.生产者和消费者模型:1.1、123规则:1.个线程安全的队列:只要保证先进先出的特性的数据结构就都可以称为队列 这个队列要保证互斥(就是保证当前只有一个线程可以对他进行操作,其他线程不可以同时来操作)还要保证同步当生产者将队列中填充满了之后要通知消费者来进行消费,消费者消费之后通知生产者来生产 2.中角色的线程:生产者和消费者(生产者往队列中生产,消费者从队列中拿内容
2022-05-17 07:45:00
372
1
原创 linux线程安全篇之----死锁问题
目录1.死锁问题1.1、死锁的两种场景第一种场景第二种场景2.造成死锁的必要条件2.1、不可剥夺2.2、循环等待2.3、互斥条件2.4、请求与保持3.预防死锁3.1.破坏必要条件:循环等得请求与保持3.2、避免锁没有被释放3.3、资源一次性分配1.死锁问题1.1、死锁的两种场景 第一种场景 线程加锁之后并没有将锁释放 1.这里我们模拟两个线程导致死锁的情况:将锁锁上之后线程退出,导致其他线程拿不到这把锁造成死锁情况
2022-05-16 07:30:00
1103
原创 linux线程安全篇之----同步
目录1.同步1.1、有了互斥还为什么要有同步?2.条件变量(实现同步的工具)2.1、条件变量的使用原理:2.2、条件变量的原理3.条件变量接口3.1、初始化接口:3.2、等待接口:3.3、唤醒接口:4.条件变量夺命连环追问4.1、条件变量的等待接口第二个参数为什么会有互斥锁?4.2、那么条件变量等待接口是先让线程入等待队列呢?还是先解锁呢?4.3、线程被唤醒之后会执行什么代码,为什么需要获取互斥锁?1.同步1.1、有了互斥还为什么要有同步?
2022-05-15 07:30:00
217
原创 Linux线程安全之---信号量
目录1.信号量:1.1、信号量的原理1.2、信号量的接口1.2.1、初始化接口:1.2.2、等待接口:1.2.3、释放接口:1.2.4、销毁接口:2.生产者与消费者信号量代码实现:3.线程池:3.1、应用场景3.2、原理:3.3、构造线程池要完成的事情3.4、代码实现4.读写锁4.1、应用场景:4.2、读写锁的三种状态4.3、读写锁的接口:面试题:1.信号量: 1.1、信号量的原理 资源计数器+PCB等待队列
2022-05-14 22:02:24
1084
原创 linux线程安全篇之----互斥
目录1.多线程造成的安全隐患:2.互斥2.1互斥:2.1.1互斥概念2.1.2互斥锁:2.1.3互斥锁的计数器当中如何保证原子性3.互斥锁的接口3.1.初始化互斥锁的接口3.1.1动态初始化:3.1.2静态初始化(直接用宏来初始化互斥锁):3.2.加锁接口3.3.解锁接口3.4.销毁接口1.多线程造成的安全隐患:2.互斥 2.1互斥: 2.1.1互斥概念 互斥的要做的事情:控制线程的访问时序。 当多 个线程..
2022-05-14 21:35:41
884
原创 C++之继承最详讲
目录 1.继承的概念 2.继承的定义 3.继承权限 3.1、子类以public方式继承父类 3.2、子类以protect方式继承 3.3、子类以private方式继承 3.4、class关键字没有给出继承方式默认的继承方式是私有的继承方式 3.5、struct关键字没有给出继承方式默认的继承方式是公共的继承方式 3.6、那么我们可以就此总结一下class和struct的区别 3.7、关于继承方式大总结 4.基类和派生类对象赋值转换 4.1、派生类对象可以赋..
2022-05-02 18:40:26
5916
6
原创 STL中的stack和queue和priority_queue的使用和模拟实现
目录1.STL中stack的基本操作:2.STL中queue的基本操作3.stack的模拟实现:4.queue的模拟实现:5.priority_queue:(优先级队列同样也是容器适配器------>就是包装其他结构)5.1priority_queue的使用:5.2priority_queuede模拟实现:6.STL库中创建堆的函数及其使用:1.什么是仿函数关于栈和队列几个问题:1.为什么栈没有提供迭代器呢?2.逆波兰表达式———————后缀表达式
2022-04-28 18:30:30
724
原创 STL中list的使用及其模拟实现
目录1.STL中的list的底层结构2.list的使用2.1构造对象:2.2链表的遍历方式:2.3链表的操作(在链表中是没有扩容操作的,因为是链表数据结构,所以直接插入元素就可以了)1.resize()2.clear()清空链表3.front()&&back()(获取首/尾元素可以直接对其进行更改)4.插入和删除元素3.list的模拟实现:1.STL中的list的底层结构STL...
2022-04-28 17:45:11
951
原创 STL中vector的使用及其模拟实现
目录1.vector对象的构造方式:2.vector对象的三种遍历方式:3.和容量相关联的使用:1.有效元素的获取和空间大小的获取。2.resize:将顺序表有效元素个数增加。3.reserve:扩容4.获取元素:1.front和back2.'[]'运算符重载5.操作元素:1.push_back和pop_back2.insert:3.clear()清空元素4.erase删除某个位置的元素或者某个区间元素5.交换两个对象6.vector迭代器失效
2022-04-28 17:38:51
667
原创 STL中string类的用法及其模拟实现
目录一、string类的默认存储字符类型:二、string类的使用:1.创建对象2.三种遍历sting的方式:2.1.for+[]的方式:2.2.迭代器:2.3.范围for遍历(其实也是依赖类中的迭代器进行遍历元素)3.插入数据的方式:4.删除数据5.reserve和resize(扩容操作)5.1.resize:5.2.reserve:5.3.疑问(resize和reserve两种平台下的扩容规律)?6.c_str()7.在字符串中找出子串8.
2022-04-28 17:31:52
815
原创 初识线程安全有这一篇就够了
1.多线程造成的安全隐患:2.同步与互斥 2.1互斥: 2.1.1互斥概念 互斥的要做的事情:控制线程的访问时序。 当多 个线程能够同时访问到临界资源的时候,有 可能会导致线程执行的结果产生二义性。而互斥就是要保证多个线程在访问同一个临界资源,执行临界区代码的时候 (非原子性性操作(线程可以被打断) ),控制访问时序。让一个线程独占临界资源执行完,再让另外一个独占执行; 2.1.2互斥锁: 互斥锁的原理 互斥 锁的本质就是0/1计数器,计 数器的取值只能为
2022-04-21 20:11:19
814
2
原创 多线程概念和线程接口
目录1.线程概念1.1进程和线程的关系(工厂和流水线的关系)1.2pid本质上是轻量级进程id,换句话说,就是线程ID1.3 linux内核是如何创建一个线程的呢?1.4线程的共享与独有独有:1.5线程的优缺点:(重中之重)2.线程控制2.1线程创建2.2线程终止2.3线程等待2.4线程分离1.线程概念 1.1进程和线程的关系(工厂和流水线的关系) 结论1 :线程是依附于进程才能存在的,如果没有 进程,则线程不会单独存在 结论2 :多线程的是
2022-04-14 18:52:58
1953
5
原创 【C++】动态内存管理
目录1.new和delete2.new和delete在底层是怎么实现的:2.1new底层的实现:2.2delete底层的实现:2.3new []底层的实现:2.4delete []的实现:3.重载new和delete4.定位new:1.new和deleteC语言内存管理方式在C++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理 这里在动态申请和释放时一定要匹配
2022-03-29 00:16:27
1682
3
原创 【C++】模板
目录1.什么是函数模板:2.模板的使用3.模板的规则:4.模板函数5.模板特化6.类模板特化6.1全特化:6.2偏特化:7.类模板的应用:8.模板的分离编译1.什么是函数模板:在实际应用中我们可能会对不同类型的对象实现同一种类型的运算,如果我们用函数重载将函数参数设置为不同类型其实也可以实现,但是这无疑会让代码的复用率变低,所以在C++中就推出了模板。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2022-03-28 23:50:57
493
3
原创 【C++】深度刨析构造函数-让你对构造函数有全新认识的一篇文章
1.构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值, 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。2.初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。以下形式: 当然我们的拷贝构造函数也是构造函数,那么
2022-03-28 00:57:12
1070
原创 【C++】类和对象
1.this指针: 1.1什么是this指针: 我们在调用类中的成员函数时,this指针起的作用是功不可没的,它是每个类中的成员函数的第一个隐形形参。负责将当前调用函数的对象的地址传入。 1.2this指针存在哪里 1.3this指针可以为空吗? 理论上this指针是不可以为空的,因为你指向一个对象的地址然后对这个对象中的成员变量进行操作,但是我们透过现象看本质,类中的函数其实是存在代码区的,因为在计算类的对象的大小时,并不会将函数的大小也算进去,所以我们可以这样理解
2022-03-27 09:43:58
893
原创 深度解析linux下信号的注册和注销原理详解及配合信号更好解决僵尸进程
1.信号的概念:信号是一个软中断 软中断: 例如:看到绿灯你可以选择走或选择不走。红绿灯只是一个提醒你可以选择走或不走 1.1只是告诉有这样一个信号,但是具体这个信号怎么处理,什么时候处理由进程决定,所以是软中断。 2.信号的产生 2.1硬件产生(按键盘中的按键): ctrl+c:2号信号 SIGINT,按下ctrl+c其实是进程收到了2号信号,2号信号导致进程的退出。 ctrl+z :20号信号SIGTSTP, ctrl+|:3号信号SIGQUIT
2022-03-27 09:08:48
3599
4
原创 深度刨析为何要内存对齐
目录1.当不进行内存对齐时对变量进行访问 2.如果我们采用内存对齐3.总结:我们先来模拟一个场景,这里我们定义一个结构体类型,再定义一个结构变量x。#include<stdio.h>struct A{ char a; int b; short c;}int main(){struct A x;return 0;}1.当不进行内存对齐时对变量进行访问 当我们...
2022-03-25 11:09:05
4146
5
原创 进程间通信之---消息队列
目录 消息队列 1.消息队列的原理 2.消息队列的接口: 2.1创建消息队列 2.2向消息队列发送消息 2.3接收消息: 2.4操作消息队列的接口 2.5代码测试: 信号量: 信号量的原理 消息队列 1.消息队列的原理 1.1 msgqueue采用链表来实现消息队列, 该链表是由系统内核维护, 1.2 系统中可能有很多的msgqueue, 每个MQ用消息队列描述符(消息队列ID: qid) 来区分,qid是唯一 的,用来区分不同的MQ..
2022-03-19 22:58:37
3204
7
原创 进程间通信之---共享内存
目录 共享内存: 1. 共享内存的原理 2.共享内存的接口 2.1创建或者获取共享内存接口 2.2将共享内存附加到进程的虚拟地址空间 2.3分离 2.4操作共享内存接口 3.共享内存代码 4.共享内存的特性 共享内存: 1. 共享内存的原理 1.1 在物理内存当中开辟一段空间 1.2不同的进程通过页表将物理内存空间映射到自己的进程虚拟地址空间当中 1.3不用的进程通过操作自己进程虚拟地址空间当中的虚拟地址,来操作共享内存 ..
2022-03-19 22:24:51
1018
6
原创 进程间通信之---管道
1.为啥需要进程间通信呢? 1.1原因: 每一个进程的数据都足存储在物理内存当中,进程通过各自的进程虚拟地址空间进行访问,访问的时候,通过各自的页表的映射关系,访问到物理内存。从进程的角度看,每个进程都认为首己拥有4G的空间,至 于物力内存当中属于如何存储,页 表如何映射,进程是不清楚。 这 也造就了进程的独立行。 1.2进程独立性: 好处:让每- -个进程在运行的时候,都是 独立进行运行的,数据不会窜。 坏处:如果两个进程之间需要数据交换,那么由于进程独立行..
2022-03-19 21:59:10
1454
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人