
c++
文章平均质量分 95
酒竹.
这个作者很懒,什么都没留下…
展开
-
进程间通信(下)
1. system V共享内存共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据那么这到底是为什么呢?1.1 共享内存示意图我们来看看吧!下图就是shm的原理图。所谓共享区,就是在内存中开辟的一块空间,然后将该内存空间挂接在进程的共享区中,这里的挂接就是将内存空间的实际地址由页表进行映射转为虚拟地址,将此虚拟地址存放入共享区(存放的还有该共享内存空间的其他相关信息,比原创 2024-05-25 10:15:26 · 1121 阅读 · 0 评论 -
红黑树模拟实现map与set
迭代器是对节点进行直接操作,因此这里的迭代器只需要封装节点的指针就可以了。原创 2024-05-15 14:06:51 · 1045 阅读 · 0 评论 -
c++红黑树的模拟实现
enum ColorRED,BLACKpublic:RBTreeNode(const pair& kv,const Color& color=RED)//颜色的缺省参数给定为红色:_kv(kv)private:其他的我们都能理解,但是颜色的缺省参数为什么给定红色呢?我们想一想,根据红黑树的几条性质,我们插入的时候要怎么检测呢?难道每插入一个都检查一下树的每条路径黑色节点个数是否相同吗?当然不是,插入时我们只需要检测是否有连续的红色节点。原创 2024-05-12 20:13:36 · 1311 阅读 · 0 评论 -
c++AVL树的模拟实现
AVL与红黑树中存放的数据都是pair结构。//左孩子//右孩子//父亲int _bf;//平衡因子,健康的平衡因子绝对值不大于1:_bf(0),_kv(kv){}这里可以看到,AVL树的节点与平衡二叉树的节点区别在于AVL树节点有一个平衡因子的存在,也即1.1概念中所述。同时AVL树采用了三叉链结构,好处在于在对树进行操作时,不必额外存储节点的父亲。假如以pParent为根的子树不平衡,即pParent的平衡因子为2或者-2,分以下情况考虑。原创 2024-05-11 17:07:26 · 1335 阅读 · 1 评论 -
c++关联容器之map与set(上)
1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set(后面讲)容器慢,但它们允许根据顺序对子集进行直接迭代。5. set在。原创 2024-05-01 20:20:05 · 53 阅读 · 0 评论 -
c++二叉树的进阶--二叉搜索树
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树注意:二叉树的中序遍历是一个有序(升序)序列。原创 2024-04-24 16:38:47 · 538 阅读 · 0 评论 -
继承与多态常见的面试题
A: 继承 B: 模板 C: 对象的自身引用 D: 动态绑定派生类无需理会基类方法的实现,但可以调用继承下来的有访问权限的方法。原创 2024-04-20 17:31:30 · 812 阅读 · 0 评论 -
c++三大特性之多态
虚函数是多态的必备构成条件之一,所谓虚函数,就是被virtual关键字修饰的成员函数。如下图就是Person类中的一个虚函数func()。原创 2024-04-18 13:23:39 · 961 阅读 · 0 评论 -
c++三大特性之 继承
以下图为例记得构造函数初始化列表的顺序吗?是按照声明顺序初始化的,基类成员显然是在派生类之前定义的。我们很难保证在派生类析构函数中不会对基类有什么操作,如果子类对象中包括基类动态开辟的空间,如下图。倘若我们先析构父类,那么如果在子类的析构中用到这块new出的空间,就会访问野指针。下面的图非常形象的总结这里的知识。1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。原创 2024-04-12 21:49:01 · 752 阅读 · 0 评论 -
c++之模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-04-10 21:12:44 · 1032 阅读 · 0 评论 -
c++之stack_queue与反向迭代器的实现
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数返回队头元素的引用返回队尾元素的引用push_back。原创 2024-04-09 20:00:32 · 1151 阅读 · 0 评论 -
c++----list模拟实现
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向带头循环链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝后迭代。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2024-03-30 12:29:02 · 1021 阅读 · 0 评论 -
STL----vector的模拟实现
(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造vector的类模板可以实例化各种类型,无论是内置类型int,char或是自定义类型string,vector都可以。//无参//构造并初始化//拷贝构造//使用迭代器区间进行初始化定义iterator的使用接口说明begin +end(重点)原创 2024-03-25 16:47:03 · 1081 阅读 · 0 评论 -
六大排序精解
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。数据元素全部放在内存中的排序。数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。原创 2024-03-21 14:23:50 · 975 阅读 · 0 评论 -
string类详解与模拟实现
C++中的迭代器是一种用于遍历容器(如数组、向量、链表等)中元素的对象。迭代器提供了一种统一的访问容器元素的方式,使得我们可以通过迭代器来访问容器中的元素,而不用关心容器的具体实现细节。在C++标准库中,迭代器被设计为类似指针的对象,可以通过递增(++)和递减(--)操作符来访问容器中的元素。迭代器可以分为多种类型,包括输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器,每种类型的迭代器支持不同的操作。原创 2024-03-12 16:46:02 · 993 阅读 · 0 评论 -
c++阶梯之模板初阶
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)原创 2024-02-28 20:19:15 · 856 阅读 · 0 评论 -
c++阶梯之内存管理
new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数有这么一个类,我们分别用malloc与new来开辟该类型的空间。malloc:new:// 动态申请一个int类型的空间//动态申请连续int类型的空间接下来我们分别用 malloc与new创建一个单链表,做一个对比。原创 2024-02-28 16:44:41 · 1049 阅读 · 0 评论 -
c++阶梯之类与对象(下)
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。对于构造函数而言,初始化列表是对成员的初始化,而函数体内则是修改赋值。我们借用调试来看看此时Date构造函数并没有开始执行,但Date类中的成员都已经被初始化了,Time类型的构造函数已经被调用执行了。这就是因为初始化列表的存在,构造函数会先执行初始化列表。如果我们未显式实现初始化列表,那么编译器会自己生成,对内置类型不做处理,即初始化为随机数 ,自定义类型调用其默认构造函数。原创 2024-02-15 17:27:49 · 1876 阅读 · 1 评论 -
c++阶梯之类与对象(中)< 续集 >
在上文中,我们学习了类的六个默认成员函数之构造,析构与拷贝构造函数,接下来我们来看看剩下的默认成员函数。原创 2024-02-07 19:48:40 · 1557 阅读 · 6 评论 -
c++阶梯之类与对象(中)
本节我们来认识一些类的默认成员函数。原创 2024-02-05 09:02:06 · 1056 阅读 · 10 评论 -
c++阶梯之类与对象(上)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class是c++定义类的关键字,className是类的名字,{ } 为类的主体。注意:{ } 后的分号。{ } 中的内容称为类的成员,其内定义的变量称为类的属性或成员变量,函数则称为方法或成员函数。1.声明与定义全部放入类体内 (如果函数定义在类内,则编译器有可能将函数当作内联函数处理)。2. 声明与定义分离,声明在类内放入 .h 文件,定义在类外放入 .cpp 文件。原创 2024-02-04 15:00:31 · 957 阅读 · 1 评论 -
c++阶梯之auto关键字与范围for
C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。char m='*';return m;auto b = a;return 0;注意使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。原创 2024-02-01 22:24:22 · 1220 阅读 · 1 评论 -
c++阶梯之引用与内联函数
指舞键盘上,悠然博弈回。如果您感兴趣,不妨看看我其他的文章,也许会有更多的收获。希望我们能在未来的日子里一起成长,共同进步。原创 2024-01-28 18:06:15 · 1034 阅读 · 0 评论 -
叩开c++的大门
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。原创 2024-01-24 18:21:23 · 919 阅读 · 0 评论