- 博客(32)
- 收藏
- 关注
原创 多线程(三)读写锁详解
一、读写锁从字面意思可以看出读写锁就是一种具有两种模式的锁(本质上是一把锁),分别为读模式和写模式,以此读写锁可以分为三种状态:读模式下的加锁状态、写模式下的加锁状态、不加锁状态;读写锁的适用于大量读小量写的场景,在大量读的环境中效率要远远高于互斥锁,他支持读模式与读模式并行,这样就调高了效率,当读线程抢占了锁之后,仍然支持其他的读线程去获取锁资源,这样既保持了原子性又提高了效率,但是在读与写同时发生的时候,它的效率与互斥锁是差不多的,并且写锁的优先级是高于读锁的;可以将它的特性简单的概括为:写独占读共
2022-05-25 21:14:57
2879
原创 多线程(一)详解线程及线程的常用方法
一、什么是线程在Linux当中线程也叫轻量级进程,为什么这么说呢,是因为线程是进程的一条执行流,是程序执行的最小单位,一个进程可以有多个线程同时运行,线程之间共享进程中的所有资源(文件描述符、信号的处理方式等等),但是每一个线程都会有自己的虚拟内存空间,包括调用堆栈,寄存器等等,这样避免了多个执行流的时候,调用栈混乱的问题。线程是一条轻量级进程,那么对于CPU来说也是抢占式执行:对于单核CPU来说,一次只能运行一个进程,并且只能执行操作系统分配的一个时间片,所以多线程就在一个CPU上面来回的替换,交
2022-04-26 20:36:48
329
1
原创 UDP协议与TCP协议
目录udp协议特点UDP传输可能遇到的问题及解决方案TCP协议特点TCP传输可能遇到的问题及解决方案udp协议特点(1)无连接 UDP通信双方在发生数据之前是不需要进行沟通的,客户端只需要知道服务端的IP地址和端口号就可以进行发送数据(2)传输不可靠 不保证数据是可靠并且有序到达对端的。(3)面向数据报 udp对于应用层和传输层数据递交的时候都是整条数据进行交付的。UDP传输可能遇到的问题及解决方案(...
2022-04-13 22:15:46
3018
1
原创 Linux程序地址空间
进程所访问的地址都是虚拟地址,并非物理内存,我们所说的程序地址空间实际上也是一块虚拟的地址空间,是操作系统通过一个mm_struct结构体所描述的地址空间。接下来介绍如何通过虚拟地址找到物理内存的:操作系统中的内存管理方式分别为:分段式、分页式、段页式分段式:原理:将虚拟地址的组成分为段号+段内偏移量,通过段号在段表中找到对应的物理内存的起始位置以及虚拟地址的偏移量组成一个完整的物理地址,找到对应的物理内存单元。优点:对编译器的地址管理比较友好,但是没有解决数据连续存储的内存利用率的
2022-02-05 23:35:19
597
1
原创 Linux下的进程详解
简单来说进程就是运行中的程序,当一个程序运行起来的时候,有数据和指令需要被cpu执行处理,根据冯诺依曼体系结构,cpu不会直接去硬盘上找程序文件进行执行处理,需要首先将程序数据信息加载到内存中。然后cpu从内存中获取数据以及指令进行执行处理。对于操作系统来说,进程就是PCB ,是一个程序运行的动态描述,通过PCB才能实现程序的运行调度管理。PCB——Linux下的PCB 就是一个struct task_struct结构体,PCB描述信息能够让操作系统调度程序运行的时候,知道进程对应的指令以及数据在内
2022-01-27 23:58:07
831
1
原创 Linux最全常用指令
目录命令(1)ls-------浏览目录下文件信息ls -a 浏览目录下所有文件,包括隐藏文件ls -l 查看目录下的详细信息(2)pwd-------查看当前所在路径,打印工作路径(绝对路径)(3)mkdir-------创建一个空目录mkdir -p 递归多层级创建目录(4)rmdir--------删除空目录rmdir -p 递归多层级创建目录(5)rm ---------删除文件rm -r 递归删除目录下所有文件,最终删除目录rm -i 提示信息(提示是否
2022-01-19 23:19:07
713
1
原创 栈和队列的模拟实现
栈的模拟实现#pragma once#include<iostream>using namespace std;//顺序栈template<class T>class SeqStack {public: SeqStack(size_t capacity = 10)//用户自行提供容量,如果用户不提供使用默认容量 :_array(new T[sizeof(T) * capacity]) , _capacity(capacity) , _top(0) {
2021-12-07 23:36:30
177
1
原创 动态数组的模拟实现以及部分算法的实现和迭代器的封装支持范围for
#include<iostream>#include<memory>using namespace std;namespace my { template<class T> class Seqlist { public: typedef T* iterator;//数组支持指针访问,因此直接对原型指针进行封装 public: //构造函数,提供默认容量,用户也可以自行提供 Seqlist(const size_t& c..
2021-12-04 14:22:41
208
1
原创 带头节点的双向循环链表的模拟实现以及链表内部算法的实现(排序、逆置)和内部迭代器的封装
#include<iostream>using namespace std;//定义链表节点template<class T>struct CBListNode { CBListNode(const T& x=T())//链表节点构造函数 :data(x) , next(nullptr) , prev(nullptr) {} T data;//数据域 CBListNode<T>* next; CBListNode<T>..
2021-12-03 23:31:46
937
原创 带头节点的单项链表最全功能实现以及其中迭代器实现
#include<iostream>using namespace std;namespace my { //定义单链表节点 template<class T> struct ListNode { ListNode(const T& x = T()) :data(x) , next(nullptr) {} T data; ListNode<T>* next; }; //封装迭代器 template<class ..
2021-12-02 21:48:33
907
原创 如何使用weak_ptr解决shared_ptr解决循环引用问题
为什么会造成循环引用问题:首先来看一段代码:在该带码的运行结果中可以看到引用计数都是2,在分别调用析构函数之后它们 的引用计数都变成1,但是只有当引用计数都变成0的时候才会真正销毁资源,因此在此代码中发生了内存泄漏。为什么引用计数会变成2:首先在声明sp1和sp2时它们的引用计数都变成1,然后分别给其中管理的指针进行赋值的时候,引用计数又会进行加1,这样在最后在析构资源就会造成了循环引用,这也就是循环引用问题,也就是shared_ptr中的缺陷。接下来描述如何解决这个问题:这个.
2021-11-24 23:47:15
1901
2
原创 哈希桶(开散列)的模拟实现以及其中哈希桶迭代器的模拟实现
开散列(哈希桶):将发生哈希冲突的元素以链表的方式串联起来,本质上是衣服一个链表的集合。哈希桶的大概结构如上图,可以理解为一个数组中每一个位置存储的是一个链表。下面大概介绍哈希桶的大概实现:首先定义存储的节点,此节点跟链表的节点雷同,next存储下一个节点的位置,data存储值域:template<class T>struct hashBucketNode { hashBucketNode(const T& x=T()) :next(nullptr) .
2021-11-20 23:06:45
203
原创 关于红黑树的迭代器原理及实现
首先介绍什么是迭代器: 迭代器是一种设计模式,设计一种结构依次序去遍历容器中的数据,而又无需暴露容器的底层设计细节,在我看来,迭代器的出现最重要的目的就是为了简单方便;同一种方式可以遍历不同的容器,不管底层结构是是顺序表,链表还是树。虽然使用方式相同,但是不同的容器中迭代器的实现方式是不同的,本文介绍红黑树的迭代器的实现方式。迭代器的本质: 本质上是指针或者对指针的封装。如何设计容器中的迭代器: 首先要明白容器的底层数据结构,按照什么规则进行遍历,其实使用一个类进行迭...
2021-11-11 22:09:55
566
原创 二叉搜索树实现详解以及二叉树搜索树部分函数实现(C++)
二叉搜索树定义具有特殊性质的二叉树,即:每一个双亲节点都比左孩子大、比右孩子小(这个不一定,具体看实现方式,本文是这样实现的),则每一次中序遍历都是有序的。每一个节点的类型template<class T>struct BStreeNode { BStreeNode() :right(nullptr),left(nullptr),data(T()){} BStreeNode<T>* right; BStreeNode<T>* left; T dat
2021-11-04 22:57:41
503
原创 多态详解(C++)
抽象类概念:将包含纯虚数的类称为抽象类virtual void Test()=0;//纯虚函数注:抽象类不能实例化对象,抽象类必须被继承,而且在子类中要对基类中的纯虚函数进行重写。多态概念 通俗来说就是多种形态,具体就是去完成某个行为,当不同的对象去完成时会产生不同的状态。举例说明:class Person {public: virtual void GoToWashRoom() = 0; void Eat() { cout << "Eat()" &..
2021-10-25 21:30:45
204
原创 C++继承详解
@[TOC]继承详解继承的概念继承机制是面向对象程序设计使代码复用最重要的手段,它允许程序员在保持原有类特性上进行扩展,增加功能,这样产生新的类称为派生类(子类),继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。简单理解就是:就像儿子继承父亲的资产一样,既有了父类原有的属性和功能由新增了自己的属性和功能即产生了子类(派生类)。继承方式class Base{}class Derived:继承权限 Base{}继承权限pubilc、protected、private作用:
2021-10-21 22:52:34
316
原创 模板(C++)
欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片
2021-10-18 21:16:31
236
原创 vector模拟实现
vector就是一个动态的顺序表,可以存放任何元素,其中使用三个指针(start,finish,end_of_storage)进行实现,本文将实现5个模块中常用的的接口。此图大致为vector的结构。首先声明迭代器以及维护的指针:typedef T* Itreator;private: Itreator start; Itreator finish; Itreator end_of_storage;一、构造和析构本文实现四种构造方法;(1)无参构造:对三个指.
2021-10-09 20:37:12
246
1
原创 vector迭代器失效
目录一:vector的迭代器是什么?二:什么的迭代器失效?三:什么引起迭代器失效? (1) 扩容操作可能会引起迭代器失效(2)vector之中的删除方法(3)swap()/clear(),也会引起迭代器失效。四:如何解决迭代器失效?一:vector的迭代器是什么? vecto迭代器是原生态类型的指针,所谓原生态类型的指针就是vector中存储的什么类型的数据,那么vector迭代器就是什么类型的指针。二:什么的迭代器失效? 迭代器失效,那...
2021-10-05 16:57:52
812
2
原创 验证一个字符串是不是回文串(只考虑字母和数字字符)
算法思路:(1)首先检验算法为字母:bool IsLetter(char ch) {//判读是不是字母 if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') { return true; } else { return false; }}(2)判断是否为回文串:首先检验是否为字符,如果是进行前后对比,如果相等比较下一对字符,直到比较到字符串中间;不是字符.
2021-09-29 18:59:21
701
2
原创 String类的模拟实现以及浅拷贝的解释
首先来介绍一下浅拷贝:所谓浅拷贝就是将一个对象中的内容原封不动发拷贝到另一个对象之中去,从字节上直接拷贝过去,这样说可能有点绕,简单来说在拷贝过程中涉及到动态内存管理,没有为其申请空间,而是将原空间的位置给了过去,可以认为共用一块空间。浅拷贝的危害:当对象要销毁时,同一份资源被销毁多次导致代码崩溃。解决方法:使用深拷贝,让每一个对象都独立拥有自己的资源,即发生拷贝构造或赋值时,重新申请一块空间将资源拷贝过去。接下来实现String类,String类中涉及到资源的管理问题,所以必须显示定义拷贝
2021-09-29 16:53:38
121
2
原创 String类的接口模块
String接口分以下几个模块(1)构造与析构(2)容量相关(3)迭代器(4)元素访问相关的(5)修改(6)特殊操作这篇博客主要谈谈构造和容量相关的首先看看构造模块:这个模块主要说String类所定义的对象的初始化问题, string s1;//定义s1对象,无初始化内容 string s2("hello world");//定义s2对象,()内表示初始化内容 string s3(s2, 3);//定义s3对象,选择s2中第三个以后的字符串初始化对象 string s4(10, 'a
2021-09-25 20:04:28
114
1
原创 C++动态内存管理
在看C++动态内存管理之前,先来看看C语言的动态内存管理:C语言中进行动态内存申请使用的是库函数(malloc/realloc/calloc),申请出来的空间在堆上,用完之后使用free()函数进行回收,防止内存泄漏。C语言中有一套动态内存的方法,那么C++中为什么还要有一套动态内存管理的方法呢?因为C++是面向对象的,那么C语言中的内存申请方法能否为C++中的对象申请空间呢?小编通过调试发现:可以将空间申请下来,但是没有调用构造函数,就可以认为如果使用malloc进行空间申请,则会申请下来一段
2021-09-21 17:12:52
150
2
原创 operator实现前置++和后置++的方法
首先看一段代码:int a = 10;int b = 0;b = a++;这段代码a,b的值如下图:在来看一段代码:int a = 10;int b = 0;b = ++a;这段代码a,b的值如下图:这样可以看出前置++和后置++的区别,我是这样记的:前置++:先++在使用;后置++:先使用在++。那么在类中重载运算符时如何实现呢?首先看前置++,先对其进行++运算然后在使用,可以直接通过地址对其位置上 的值进行++,然后返回该地址。看下面实现代码,这..
2021-09-15 17:51:04
395
原创 C++中的引用到底是什么???
首先看这样一段代码:int a = 10;int& ra = a;这段代码看上去其实是很简单的,关键就在于代码中的“&”符号这是什么意思你?这个就是C++中的引用,代码中的“ra”可不是新定义的一个变量,而是给变量“a”取了一个别名,就相当于生活中所取的外号,“a”和“ra”其实指向的是一块共同的空间,依次就得到了引用的定义。引用:不是新定义的变量,而是给已有的变量取了一个别名,编译器不会为它开辟一块新的空间,而是两者共用一块空间。知道了引用的定义,那么引用的作用是什
2021-07-25 23:08:32
872
5
原创 函数重载(C++)
首先我们来谈一谈函数重载的定义:函数重载:在相同作用域中,函数的名字相同,但是函数的参数列表不同,其实本质上是几个不同的方法。下面演示函数重载:int Add(int x, int y) { return x + y;}double Add(double x, double y) { return x + y;}那么问题来了,看看如下代码是函数重载吗?int Add(double x, double y) { return x + y;}double Add(doub
2021-07-23 10:02:30
278
2
原创 简单插入排序(C语言)
【算法思想】:将一个无序序列插入到一个有序序列,将无序序列中的数据与有序序列中数据比较,从有序序列最后一个数据依次向前比较,若符合排序规则(升序或降序),则将无序序列中比较的那一个数据插入有序撕...
2021-06-08 00:10:27
3032
4
原创 冒泡排序法
【算法思想】反复扫描待排序记录序列,在扫描的过程中顺次比较相邻的两个元素的大小,若逆序就交换位置。以升序为例,在第一趟冒泡排序中,从第一个记录开始,扫描整个待排冒泡排序序记录序列,若相邻的两个记录逆序,则交换位置。在扫描的过程中,不断地将相邻两个记录中关键字大的记录向后移动,最后必然将待排序记录序列中的最大关键字记录换到待排序记录序列的末尾,这也是最大关键字记录应在的位置。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是使次大的记录被放在第n-1个记录的位置上。然后进行第三..
2021-06-02 00:04:54
222
7
原创 二叉树的创建
本文采用先序遍历来创建二叉树先序遍历:首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回...
2021-05-31 22:46:44
1975
2
原创 2021-05-27
二叉树的非递归实现(C语言版)算法描述:二叉树的非递归实现主要借助链式栈的实现;首先建立一棵二叉树;将二叉树的根节点拷贝出来,并加以标记标记为false;将它放入栈容器中,然后出栈,判断拿出来的结点标记符号;如果是false,则将它的左右孩子拷贝出来并标记为false;并把根结点的标记改为true;然后按次序先右后左在根的次序入栈,然后在进行出栈顶元素,判断它的标记符号,如果是true直接打印出来,如果是null则说明此根的某一个孩子为空,如果是false则进行如上的循环;直到栈的元素个数为0 时结
2021-05-27 18:02:25
108
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人