自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 关于浮点数的四舍五入问题

最后,我在gcc上跑完之后,又去vs2022上验证了一下,都是一样的,所以大胆食用,关于这个算法,我自己的看法就是,为什么选择趋偶呢,是因为大多数偶数是不会发生精度丢失的,可以避免很多系统性误差,我也查了很多资料,关于银行家舍入法。结果显示,银行家舍入法旨在减小舍入误差,以确保结果更接近数学期望,而且,金融和会计领域通常要求精确的数值计算,而银行家舍入法在这些领域中是常见的舍入方式。最后的最后,希望我的这篇文章可以帮助到看了文章的你,

2024-01-16 00:02:32 1120 2

原创 计算机网络中的应用层和传输层(http/tcp)

在之前的几篇文章中,我们一起看过一些关于linux中关于网络的系统调用,就已经可以写一个简易的服务器了,那我们在别人面前提起网络,都会听到一个字眼叫做协议,在网络中的每一层中,都有协议,在上一篇文章中,我们也说过,协议就是两台主机在通信的时候,约定好的通信格式,多方都遵守这个通信格式来通信的话,就可以实现正确通信,可以拿到对方发给我的正确信息。我们可以模拟一个协议,对协议进行一个通俗一点的理解。

2023-09-10 20:49:02 1988 1

原创 网络编程套接字,Linux下实现echo服务器和客户端

目录1、一些网络中的名词1.1 IP地址1.2 端口号port1.3 "端口号" 和 "进程ID"1.4 初始TCP协议1.5 UDP协议2、socket编程接口2.1 socket 常见API2.2 sockaddr结构3、简单的网络程序3.1 udp实现echo服务器和客户端3.1.1 echo服务器实现3.1.2 echo客户端实现3.1.3 运行结果3.2 tcp实现echo服务器和客户端3.2.1 多进程的echo服务器3.2.2 基于线程池tcp的echo服务器 3.3 代码中的一些函数3.

2023-09-07 17:09:00 1787

原创 计算机网络初识

负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.负责地址管理和路由选择. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.就需要有人站出来, 约定一个共同的标准,大家都来遵守, 这就是 网络协议;

2023-09-05 19:45:24 477

原创 Linux中的多线程剖析

今天呢,我们来深度理解一下什么时多线程,还有他的相关操作,可是为什么叫Linux中的多线程剖析呢,因为多线程在Linux和Windows系统底层中的实现并不一样,相比之下,Windows的实现更加的复杂,而Linux中的简单一些,有利于理解,好了下面我们进入正片。好了,今天的分享就到这里了,如果文章对你有帮助,请留下你的评论,如果有错误,也请评论私信作者,

2023-09-04 21:27:17 1170 1

原创 Linux操作系统中的信号剖析,

信号是一种信息载体,在现实中,信号就是表示消息的物理量,比如说红绿灯,古时候狼烟等等,就拿红绿灯来说,为什人和车辆都是看到绿灯才会通行,红灯亮了就要停下来,因为这是现实生活中制定的规则,那么在操作系统中,也有一种叫做信号的东西,那操作系统中的信号又是怎么一回事,在这篇文章里,咱们一起讨论一下吧!

2023-09-01 14:10:45 126

原创 初始Linux进程间通信(单机)

在程序运行期间,每一个程序,每一个进程都是独立的,包括父子进程,写时拷贝也保证了每个进程的独立性,但是呢,在某些场景,就是需要我们进行不同的进程间通信,交互数据,今天咱们就来看看在单机模式下,有哪些可以进行进程间通信的方式呢。

2023-08-30 19:51:13 146

原创 Linux中的基础IO

因为呢在一个操作系统的底层,他需要和一些驱动硬件的驱动做交互,也就是管理整个系统,不管是硬件,还是一些硬件驱动的软件,那些层面的功能十分的繁杂繁琐,要是这样暴露给开发者,那样的话,开发的成本会大大提升,所以呢在设计之初呢,人们选择对操作系统的底层做封装,不暴露下层的细节,对上层提供可操作的接口,这些接口就是系统调用,用来和底层交互。在一个进程启动的时候,文件描述符为0,1,2的三个位置已经被占了,如果我们将1或者0中对应的文件关闭,这个时候在打开文件,这个文件的文件描述符还会是3嘛,我们来验证一下:。

2023-08-29 17:46:36 859

原创 Linux进程(续)进程的创建,写时拷贝,进程的等待,进程的替换

在上一篇文章中,我提到了关于进程的一些东西,说到了fork,以及僵尸进程,但是没有细说,关于fork的一些细节,还有僵尸进程会占用系统资源的问题该怎么解决之类的,今天这篇文章就来进一步说说,好了,我们进入正题。

2023-08-26 23:20:07 86

原创 Linux中的进程、fork、进程状态、环境变量

进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。课本上称之为PCB(process control block),Linux操作系统下的PCB是: task_struct在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息。

2023-08-26 22:40:00 206

原创 Linux中的工具:yum,vim,gcc/g++,make/makefile,gdb

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。

2023-08-23 20:45:28 1290

原创 Linux的权限

Linux下有两种用户:超级用户(root)、普通用户。超级用户:可以再linux系统下做任何事情,不受限制普通用户:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。命令:su [用户名]功能:切换用户。例如,要从root用户切换到普通用户user,则使用 su user。要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。

2023-08-22 19:41:09 292

原创 Linux中的基础命令

说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。-F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;2. 当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。-a或–all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。

2023-08-22 16:29:37 379

原创 单例模式中的饿汉式和懒汉式

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。多个单例类的实力顺序不确定,如果有单例类之间引用的场景,可能会出现某些错误,

2023-08-18 11:42:23 117

原创 资源泄露与C++中的智能指针

内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.

2023-08-17 20:44:43 89

原创 C++11中常用的一些特性

1. 左值引用只能引用左值,不能引用右值。2. 但是const左值引用既可引用左值,也可引用右值。

2023-08-16 20:46:00 120

原创 位图和布隆过滤器,以及哈希切割思想

在好多面试题中,会有海量数据量的场景,那么遇到这些问题该怎么去入手,今天来看看位图和布隆过滤器以及哈希切割的思想,本篇文章仅仅为个人学习过程中的记录,如果有错误,请各位友友们指出,

2023-08-15 21:01:09 194

原创 哈希、C++中的unordered系列关联式容器,模拟hashtable,用模拟实现的hashtable,封装unordered_set 和 unordered_map,

目录一、前言二、hash1、哈希的原理2、哈希冲突3、闭散列(1)线性探测 (2)二次探测4、开散列KeyOfV开散列与闭散列比较三、封装 unordered_set 和 unordered_map1、unordered_set2、unordered_map续,之前再说set和map的时候,说的C++中的关联式容器还有另外的两种,分别为unordered_set和unordered_map,他们之间的区别呢,就是底层实现上,set和map的底层使用红黑树实现的,而unordered_set 和unorder

2023-08-15 16:26:42 244

原创 红黑树的性质、平衡过程的模拟实现、迭代器的模拟实现,以及用自己实现的红黑树封装map和set

RED,BLACK// 为了后序封装map和set,在实现时给红黑树多增加了一个头结点public:RBTree()// 在红黑树中插入值为data的节点,// 注意:为了简单起见,本次实现红黑树不存储重复性元素// 检测红黑树中是否存在值为data的节点,存在返回该节点的地址,否则返回nullptrreturn cur;return cur;// 获取红黑树最左侧节点if (!return cur;return cur;// 获取红黑树最右侧节点。

2023-08-13 21:12:04 173

原创 AVL树的平衡过程

AVL树是数据结构的发展史中一个过度的数据结构,他解决了搜索二叉树的一些缺陷,让数据的插入不论有多么不均衡,都能保持树的各个子树平衡,保持树的最佳搜索姿态。这篇文章是我个人在学习过程中,对自己的理解的一个总结,如果有什么错误,欢迎大家私信我,、我们定义结点的时候,加上父亲节点,方便我们实现,使用平衡因子来记录节点的平衡状态。我们定义平衡因子等于右子树的高度减去左子树的高度{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。

2023-08-12 20:18:53 213

原创 C++中的set和map

在C++中的STL中有很多的容器,就像我之前有发表过关于STL中的vector,queue,stack等的容器相关的文章,那今天我想浅浅的说说关于C++中的关联式容器其中的set和map。本文仅为作者的个人学习见解,如果有错误或者其他问题,可以私信作者。

2023-08-11 15:41:35 54

原创 二叉搜索树的实现

之前对二叉树进行了实现,这次对二叉搜索树进行实现,可能有的小伙伴会觉得没有必要,但其实,二叉搜索树有很多可以使用的场景,虽然二叉搜索树有缺陷,但是这种数据结构也很值得去玩,从中可以获得很多新的感悟。如有错误和其他问题!欢迎各位朋友私信我!

2023-08-10 12:20:03 122

原创 C++中的多态

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。

2023-08-04 22:41:38 31

原创 C++中的继承

1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。3. 继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象。优先使用对象组合,而不是类继承。

2023-08-04 09:08:54 44

原创 C++中的栈和队列(stack,queue,priority_queue,容器适配器)以及模拟实现

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,为什么选择deque作为stack和queue的底层默认容器。

2023-07-29 19:19:22 69

原创 C++中的list解读、模拟实现list以及list的迭代器

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

2023-07-22 23:11:13 129

原创 C++中的vector结构解读、迭代器失效问题以及模拟实现

(constructor)构造函数的声明接口说明vector()无参构造构造并初始化n和val拷贝构造使用迭代器进行初始化赋值运算符的重载。

2023-07-22 15:16:27 1515

原创 C++中的string类,(浅浅模拟实现一下)

C++中的string类是要比STL出现的早的,但是string类的接口和常规容器的接口基本相同,其实对于string类没有特别要注意的点,那我就浅浅的模拟实现一下吧,有什么问题欢迎大家指出来。

2023-07-20 19:58:58 25

原创 C++中的模板(泛型)

编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。

2023-07-18 12:22:20 40 1

原创 C++中的内存管理

今天我们来看看C++中的内存管理相关的内容:1、C++中的内存区域划分:1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。(Linux课程如果没学到这块,现在只需要了解一下)3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。2. C语言中动态内存管理方

2023-07-17 17:25:29 58 1

原创 C++中的类与对象(再续)

在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。所以,在用类去创建对象的时候,对象的成员初始化其实都是在初始化列表中进行定义初始化的,初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)

2023-07-17 13:28:04 54 1

原创 C++中的类与对象(续)

声明:本系列文章循序渐进的记录我研究学习c++的过程,如果有部队的地方,还请大佬在评论区评论。

2023-07-16 22:36:25 68 1

原创 C++中的类与对象

/类体……//一定要注意类的大括号外有一个分号。class是定义类的关键字,其中ClassName是类的名字,{} 中是类的类体,注意类定义结束时后面的分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。//Person.h//声明放在Person.h的头文件中public:private:char* name;

2023-07-16 19:41:10 89 1

原创 C++基础来喽(入门基础)

C++基础终于来了,一直都对C++的语法挺感兴趣的,只是之前没有系统的学习过,最近才开始研究,记得去年在考研的时候(虽然没上岸),专业课考的数据结构中,就有一些C和C++混合的语法,那会没时间去仔细深入的学习,只知道怎么去用,现在终于有时间去学习了,这篇文章,就仅仅介绍C++的一些基础,其他的面向对象,继承,多态,STL会在之后的文章里分享。

2023-07-13 22:09:14 96 1

原创 排序以及七大排序(直接插入排序、希尔排序、选择排序、堆排序、交换排序、快速排序、归并排序)

排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。内部排序:数据元素全部放在内存中的排序。外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。

2023-07-12 18:58:51 105 1

原创 关于数据结构中的树和二叉树

树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i<= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继因此,树是递归定义的。注意:树形结构中,子树之间不能有交集,否则就不是树形结构。

2023-07-09 17:23:14 97 1

原创 关于数据结构中的栈和队列

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。1.2栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价比较小。

2023-07-04 23:53:46 34

原创 关于数据结构中的链表和顺序表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2023-07-04 11:43:54 25

原创 关于C语言中程序的预编译,编译,汇编以及链接

C语言中,一段代码的执行,需要经过编译和链接两个步骤,其中编译阶段又是分为三步来完成的,分别是:预编译,编译,汇编。所以说,一段代码写出来到执行,一共经历了预编译,编译,汇编,链接四个步骤。但底层其实做了更多的事情,这里就不说那么细了,因为我也不知道,哈哈哈哈哈,想要多了解的话,可以去看看《编译原理》这本书。今天的分享内容主要是预编译阶段,其他的几个阶段都只是稍稍提及一下。

2023-05-19 23:25:54 430 1

原创 C语言中对文件的操作

每种语言都有对文件操作的相关功能。但我们知道,文件是存储在硬盘中的,而程序是运行在内存中的,要让程序在内存中运行的时候去操作硬盘中的文件,靠的其实是计算机底层的一些东西。在计算机底层,向上暴露出了一些功能接口,开发人员就可以通过这些接口来更好地操作计算机。有很多用c开发的项目,用的文件操作是一些经过封装好的第三方工具,但其实呢,C语言本身也有对文件进行操作的函数,接下来就一起来了解一下:要了解对文件操作的一些函数,那我们首先要知道什么叫文件,

2023-05-17 16:17:20 44 1

空空如也

空空如也

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

TA关注的人

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