自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【C++庖丁解牛】异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了服务器开发中通常使用的异常继承体系class Exception //基类public:, _id(id){}virtual string what() const //获取错误描述protected://错误描述int _id;//错误编号。

2024-05-17 21:12:23 961 4

原创 【C++庖丁解牛】C++11---lambda表达式 | 包装器

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-05-02 10:03:50 672 21

原创 【C++庖丁解牛】C++11---新的类的功能 | 可变参数模板

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-04-30 15:10:51 1122 34

原创 【C++庖丁解牛】C++11---右值引用和移动语义

C++11正是通过引入右值引用来优化性能,具体来说是通过移动语义来避免无谓拷贝的问题,通过move语义来将临时生成的左值中的资源无代价的转移到另外一个对象中去,通过完美转发来解决不能按照参数实际类型来转发的问题(同时,完美转发获得的一个好处是可以实现移动语义)。在C++11中所有的值必属于左值、右值两者之一,右值又可以细分为纯右值、将亡值。在C++11中可以取地址的有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值)。举个例子,

2024-04-23 15:29:37 1736 65

原创 【C++庖丁解牛】C++11---统一的列表初始化 | auto | decltype | nullptr | STL中一些变化

🍁在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。🍁不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。🎄从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2024-04-18 16:31:05 1371 47

原创 【C++庖丁解牛】哈希表/散列表的设计原理 | 哈希函数

unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。

2024-04-14 21:03:58 1328 40

原创 【操作系统专题】详解操作系统 | 操作系统的目标和功能 | 操作系统如何工作

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-04-14 19:29:18 1054 13

原创 【C++庖丁解牛】底层为红黑树结构的关联式容器--哈希容器(unordered_map和unordered_set)

unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

2024-04-14 11:25:28 1169 12

原创 【操作系统专题】计算机系统概述

操作系统利用一个或多个处理器的硬件资源,为系统用户提供一组服务,它还代表用户来管理辅助存储器的输入/输出设备,因此,在开始分析操作系统之前,掌握一些底层的计算机系统硬件知识很重要。在全部指令周期中,处理器在取指令时至少访问一次存储器,而且通常还要多次访问存储器用于取操作数或保存结果。处理器执行指令的速度显然受存储周期(从存储器中读一个字或写一个字到存储器中所花的时间)的限制。长期以来,由于处理器和内存的速度不匹配,这个限制已经成为很严重的问题。

2024-04-13 20:24:28 677 14

原创 【linux深入剖析】动态库的使用(续) | 动静态库的链接

这里的mylib.tgz就是我们的库打包文件。

2024-04-12 23:17:10 1390 34

原创 【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-04-11 20:11:48 1985 180

原创 【linux深入剖析】深入理解基础外设--磁盘以及理解文件系统

我们所有的文件都是与进程相关的文件–进程打开的文件系统中是不是所有的文件都被打开了呢?如果没有被打开呢?那么没有被打开的文件在哪里保存起来呢?在宏观上,大部分文件是没有被打开的。没有被打开的文件保存在磁盘,SSD中。文件被打开后会在内存里,也会像进程一般,OS会有一定的数据结构对其进行管理,那么OS要不要管理一下磁盘上的文件呢?

2024-04-09 21:05:24 1562 85

原创 【C++庖丁解牛】高阶数据结构---红黑树详解(万字超详细全面介绍红黑树)

这篇文章我们再来学习一种平衡搜索二叉树——红黑树如果要说常见的数据结构里,哪个数据结构最麻烦、最难以掌握?绝对非红黑树莫属了,如果只是自己看的话很多人可能看很多遍都不太懂红黑树。红黑树和AVL树都是常见的自平衡二叉搜索树,它们都可以用于高效地支持插入、删除和查找等操作。虽然它们都能够保持树的平衡性,但在不同的应用场景下,红黑树和AVL树有各自的优势和适用性。// 节点的颜色// 红黑树节点的定义{}// 节点的左孩子// 节点的右孩子。

2024-04-02 19:43:58 2101 174

原创 【C++庖丁解牛】自平衡二叉搜索树--AVL树

前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。

2024-03-31 21:11:49 1980 196

原创 【C++庖丁解牛】基于红黑树实现的两种常用的关联容器map和set以及multimap

🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油目录1. 关联式容器2. 键值对3. 树形结构的关联式容器4. set的介绍5. set的使用5.1 set的模板参数列表5.2 set的构造5.3 set的迭代器5.4 set的容量5.5 set修改操作5.6 set的使用举例构造及其遍历find and erasecountlower_boundupper_

2024-03-30 21:56:54 1464 37

原创 【linux深入剖析】文件描述符 | 对比 fd 和 FILE | 缓冲区

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-03-29 19:30:41 1753 27

原创 【linux深入剖析】基础IO操作 | 使用Linux库函数实现读写操作 | 文件相关系统调用接口

本节的学习我们需要弄清几个概念文件 = 内容 + 属性访问文件之前,都得先打开,然后再进行修改文件的操作,通过执行代码的方式完成修改,这期间文件必须被加载到内存中—内存文件打开文件的操作是通过进程的形式来实现的一个进程可以打开多个文件进程没有打开的文件会被存在在磁盘中—磁盘文件一定时间段内,系统中存才多个进程,也可能同时存在更多的被打开的文件,操作系统(OS)要不要管理多个被进程打开的文件呢?这个答案是肯定的,但是我们更需要理解的是其如何对这些进行管理的?先描述再组织。

2024-03-27 12:22:52 1835 147

原创 【算法专题--双指针算法】leecode-15.三数之和(medium)、leecode-18. 四数之和(medium)

双指针常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

2024-03-25 23:13:38 2025 48

原创 【算法专题--双指针算法】leecode-611. 有效三角形的个数(medium)、leecode-LCR 179. 查找总价格为目标值的两个商品(easy)

双指针常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

2024-03-25 22:41:57 705 3

原创 【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

🍁你好,我是📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-03-23 18:21:02 2148 182

原创 【C++庖丁解牛】面向对象的三大特性之一多态 | 抽象类 | 多态的原理 | 单继承和多继承关系中的虚函数表

需要声明的,本节课件中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。

2024-03-21 17:25:22 977 27

原创 【算法专题--双指针算法】leecode-202. 快乐数(medium)、leecode-11. 盛最多水的容器(medium)

双指针常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列。

2024-03-20 09:13:58 2599 50

原创 【C++庖丁解牛】继承的概念及定义 | 继承中的作用域 | 继承与友元继承与静态成员 | 复杂的菱形继承及菱形虚拟继承

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

2024-03-19 16:41:41 1914 25

原创 【C++庖丁解牛】stack的介绍和使用 | queue的介绍和使用 | priority_queue的介绍和使用

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back。

2024-03-18 16:08:49 2059 135

原创 【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

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

2024-03-16 18:07:25 1787 100

原创 【算法专题--双指针算法】leetcode--283. 移动零、leetcode--1089. 复写零

双指针常见的双指针有两种形式,一种是对撞指针,⼀种是左右指针。对撞指针:一般用于顺序结构中,也称左右指针。对撞指针从两端向中间移动。一个指针从最左端开始,另⼀个从最右端开始,然后逐渐往中间逼近。对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环),也就是:left == right (两个指针指向同一个位置)left > right (两个指针错开)快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列。

2024-03-15 22:41:07 1563 130

原创 【linux深入剖析】操作系统与用户之间的接口:自定义简易shell制作全过程

首先做一个shell的目录,用来装我们的自定义shel然后在目录下创建Makefile文件以及myshell.c文件编写Makefile和myshell.c文件Makefile上面几步很好走,最重要的是我们的myshell.c文件应该如何去编写呢?

2024-03-14 16:57:05 1198 22

原创 【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)

我们前面介绍了vector容器的概念以及对其基本使用进行了介绍,如果你在这里不知道vector是什么以及不知道如何使用的话,可以进入本人主页,在C++专栏里有介绍为了对小白友好,在这我简单介绍一下C++中的vector是一个动态数组容器,可以存储不同类型的元素。它提供了一系列的成员函数来方便地操作和管理数组。动态大小:vector的大小可以根据需要动态调整,可以在运行时添加或删除元素。随机访问:可以通过索引直接访问vector中的元素,支持常数时间的随机访问。

2024-03-13 08:13:28 1547 114

原创 【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

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

2024-03-11 18:42:47 1219 110

原创 【C++庖丁解牛】模拟实现STL的string容器(最后附源码)

就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了。

2024-03-11 18:42:39 934 31

原创 【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用

函数名称功能说明push_back在字符串后尾插字符cappend在字符串后追加一个字符串operator+= (重点)在字符串后追加字符串strc_str(重点)返回C格式字符串findnpos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置substr在str中从pos位置开始,截取n个字符,然后将其返回。

2024-03-10 09:00:00 1085 58

原创 【C++庖丁解牛】STL简介 | string容器初次见面

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。

2024-03-09 10:18:15 1140 30

原创 【C++庖丁解牛】C++内存管理 | new和delete的使用以及使用原理

int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数cout

2024-03-07 09:00:00 1545 111

原创 【C++庖丁解牛】模版初阶

class 类模板名// 类内成员定义public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。

2024-03-07 09:00:00 1266 42

原创 【C++庖丁解牛】初始化列表 | Static对象 | 友元函数

内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。

2024-03-05 16:06:56 1320 18

原创 【C++庖丁解牛】默认成员函数

如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。构造函数、析构函数、拷贝构造函数、赋值运算符重载、普通对象取地址重载、const修饰对象的取地址重载。所有的默认成员函数都是可以由编译器自己生成的,编译器会自己生成一个默认的函数。同时我们也可以自己定义这些函数,那么编译器就会直接使用我们定义好的函数而不会自己再生成了。

2024-03-04 16:32:55 1214 118

原创 【C++庖丁解牛】类与对象

/ 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::一般情况下,更期望采用第二种方式。

2024-03-02 20:15:40 1329 33

原创 【Linux深入剖析】进程控制 | 进程程序替换--长篇深层次讨论

对写的理解,对数据的操作无非增删查改,这也是需要完整数据操作的,例如a++,这也是在原数据之上进行操作,这也是为了确保程序的完整性。

2024-03-02 08:00:00 1481 39

原创 【Linux深入剖析】再续环境变量 | 进程地址空间

进程地址空间,每一个进程,都会存在一个进程空间,32【0,4GB】进程地址空间的本质是数据结构,具体到进程中,就是特定的数据结构的对象,里面存储的是我们的虚拟地址,由操作系统提供。进程地址空间本质是进程看待内存的方式,抽象出来的一个概念,内核中用一个结构体mm_struct表示,这样每个进程都认为自己独占系统内存资源。我们的地址空间,不具备对我们的代码和数据的保存能力!在物理内存中存放的!将地址空间上的地址(虚拟/线性)转化到物理内存中,操作系统给我们的进程提供了一张映射表—页表。

2024-02-29 11:39:39 1571 150

原创 【Linux深入剖析】进程优先级 | 命令行参数 | 环境变量

📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识。

2024-02-27 09:00:00 2018 81

空空如也

空空如也

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

TA关注的人

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