C++
文章平均质量分 92
IfYouHave
这个作者很懒,什么都没留下…
展开
-
C++初阶——类和对象(1)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。类的两种定义方式:1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。原创 2023-03-23 22:51:18 · 474 阅读 · 0 评论 -
C++进阶—C++11新特性(移动语义&&右值引用&&可变参数模板&&lambda表达式&&function包装器&&bind函数)
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了 C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞 进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2023-07-17 11:45:40 · 1114 阅读 · 0 评论 -
C++进阶—哈希/unordered系列关联式容器/底层结构(一篇文章学习哈希)
一篇文章解决Hash,字典类型又被称为关联数组(associative array),关联数组和正常数组的使用方法是相似的,但其不同之处在于字典结构的下标不必是整数,而可以是任意类型。map和unordered_map这两种字典结构都是通过键值对(key-value)存储数据的,键(key)和值(value)的数据类型可以不同。但是字典中的key只能存在一个,即必须唯一(如果不唯一,则被称为multimap)。原创 2023-07-14 19:08:26 · 1066 阅读 · 0 评论 -
C++进阶—红黑树详解及map、set封装(3)
/节点的值域//结点的颜色,_kv(kv){}情况一:uncle为空,或者uncle的颜色为黑色情况二:不断处理过程中,cur的parent为黑色,此树便处理完成,如下图情况三:cur走到根节点,此时cur为所有路径的根,且cur为红色,只需要将cur颜色变为黑色,此树便处理完成。原创 2023-07-07 08:16:02 · 207 阅读 · 0 评论 -
C++进阶—AVL树(2)
前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个 共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。原创 2023-07-04 10:10:30 · 176 阅读 · 0 评论 -
C++进阶—map、set及multimap、multiset(1)
set文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。原创 2023-07-03 12:14:45 · 175 阅读 · 0 评论 -
C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)
该种方式在现实生活中非常常见: 比如英汉词典就是英文与中文的对应关系,通过英文可以快速找到与其对应的中文,英 文单词与其对应的中文就构成一种键值对;再比如统计单词次数,统计成功后,给定单词就可快速找到其出现的次数,单词与其出 现次数就是就构成一种键值对。比如:给一个单词word,判断该单词是否拼写正确,具体方式如下: 以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。原创 2023-06-27 16:40:20 · 369 阅读 · 0 评论 -
C++进阶—二叉搜索树
二叉树和堆二叉树链式结构的实现二叉树层序遍历map和set特性需要先铺垫二叉搜索树,而二叉搜索树也是一种树形结构二叉搜索树的特性了解,有助于更好的理解map和set的特性二叉树中部分面试题稍微有点难度,在前面学习不容易接受,且时间长容易忘有些OJ题使用C语言方式实现比较麻烦,比如有些地方要返回动态开辟的二维数组,非常麻烦。因此最近有关二叉树搜索树的文章,是对二叉树部分进行收尾总结。原创 2023-06-25 13:52:37 · 314 阅读 · 0 评论 -
C++进阶—多态
需要声明的,以下代码及解释都是在vs2022下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题 等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2023-06-24 11:25:25 · 482 阅读 · 0 评论 -
C++进阶—继承(下)菱形(虚拟)继承分析&&虚拟继承存储对象模型
这篇文章主要接上篇文章,从更深层次理解普通继承切片切割以及虚拟继承切片切割,从底部虚拟内存分析,以及分析C++多继承带来的一些问题,和C++解决多继承带来问题采取的方式,并从底层内存观察其逐步实现及原理,最终更深层次感受多继承!并从软件工程分析继承和组合两个概念!!!很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱 形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设 计出菱形继承。否则在复杂度及性能上都有问题。原创 2023-06-22 23:23:10 · 901 阅读 · 0 评论 -
C++进阶—继承(上)简单特性
继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了/*Student和Teacher复用了Person的成员。原创 2023-06-21 20:40:20 · 368 阅读 · 0 评论 -
C++初阶—模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2023-06-21 11:04:10 · 830 阅读 · 0 评论 -
C++初阶—完善适配器(反向迭代器)
本篇文章主要根据前面所实现的STL中支持迭代器的容器进行完善,使用了适配器原则,传递正向迭代器数据类型,从而实现反向迭代器。原创 2023-06-20 09:25:53 · 299 阅读 · 0 评论 -
C++初阶—stack&&queue
stack文档stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下。原创 2023-06-20 08:10:38 · 332 阅读 · 0 评论 -
C++初阶—list深度解剖及模拟实现
list 容器,又称双向链表容器,即该容器的底层是以带头双向循环链表的形式实现的。这意味着,list 容器中的元素可以分散存储在内存空间里,而不是必须存储在一整块连续的内存空间中。list链表是序列容器,允许在序列内的任何位置进行常量时间的插入和删除操作,以及两个方向的迭代。本篇文章暂时不讲解拟制迭代器,将后续进行讲解!list单独提供了merge归并排序是通过与前面元素的链接和后面元素的链接的每个元素的关联在内部保持的。原创 2023-06-14 19:25:33 · 935 阅读 · 0 评论 -
C++初阶—list介绍和使用
list文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。原创 2023-04-13 18:29:00 · 402 阅读 · 0 评论 -
C++初阶—vector深度剖析及模拟实现
vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对C++普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素。原创 2023-04-12 18:20:09 · 782 阅读 · 0 评论 -
C++初阶—vector介绍和使用
vector文档介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2023-04-11 09:43:05 · 551 阅读 · 0 评论 -
C++初阶—string类(3)模拟实现
模拟实现string类,最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。原创 2023-04-10 09:36:28 · 512 阅读 · 0 评论 -
C++初阶—string类(2)
字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)int main()// 不要使用cin>>line,因为会它遇到空格就结束了return 0;原创 2023-04-07 16:27:00 · 510 阅读 · 0 评论 -
C++初阶—string类(1)
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库中的字符串操作函数。string类中还有一些其他的操作,这里不一一列举,在需要用到时不明白了查文档即可。但由于使用习惯,很少使用。原创 2023-04-05 12:30:37 · 422 阅读 · 0 评论 -
C++初阶—STL简介
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低, 符号命名比较怪异。由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。简单总结一下:学习STL的三个境界:能用,明理,能扩展。原创 2023-04-04 18:09:48 · 516 阅读 · 0 评论 -
C++初阶——模板初阶
class 类模板名// 类内成员定义public:, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表。原创 2023-04-03 12:38:38 · 452 阅读 · 0 评论 -
C++初阶——内存管理
int main()//不会初始化,只是指向了一块空间return 0;free(p1);//释放空间//堆上申请空间//new 会自动调用构造函数,进行初始化delete p2;//释放空间会自动调用析构函数,清理对象中的资源//析构:后构造的先析构//结论:new/delete 是为自定义类型准备的//不仅会在堆上申请出来,还会自动调用构造函数初始化和析构函数清理。原创 2023-03-31 15:34:57 · 1190 阅读 · 0 评论 -
C++初阶——类和对象(4)封装/友元
1. 再谈构造函数2. Static成员3. 友元4. 内部类5. 再次理解类和对象原创 2023-03-26 18:14:20 · 436 阅读 · 0 评论 -
C++初阶——类和对象(3)赋值/运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。原创 2023-03-25 19:59:29 · 441 阅读 · 0 评论 -
C++初阶——类和对象(2)构造/析构/拷贝
内置类型就是语言提供的数据类型,如: int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,原创 2023-03-24 17:31:16 · 293 阅读 · 0 评论 -
C/C++——声明/定义/内联函数/类 在编译环节的具体实现
(A)int i;哪个是定义?哪个是声明?或者都是定义或者都是声明?所谓的定义就是(编译器)创建一个对象,为这个对象分配了一块内存,并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。这个名字 一旦和这块内存匹配起来,它们就同生共死, 终生不离不弃;并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内、全局等)只能被定义一次;如果定义多次,编译器会提示用户重复定义了同一个变量或对象。在头文件是否可以定义全局变量?告诉编译器,这个名字已经匹配到一块内存。原创 2023-03-23 22:44:24 · 1140 阅读 · 0 评论 -
C++初阶——入门(3)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有 人去使用它,大家可思考下为什么?C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型 指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。i++)//范围for,自动推导类型,自动迭代,自动判断结束,自动++原创 2023-03-23 14:52:09 · 706 阅读 · 0 评论 -
C++初阶——入门(1)
C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助,主要目标:1. 补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO 方面、函数方面、指针方面、宏方面等。2. 为后续类和对象学习打基础。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。// 1. 正常的命名空间定义//命名空间中可以定义变量/函数/类型。原创 2023-03-21 14:43:34 · 415 阅读 · 2 评论 -
C++初阶——入门(2)引用
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。原创 2023-03-21 19:56:29 · 329 阅读 · 0 评论 -
C++初阶——前言
1. 写博客 经常写博客不仅可以记录自己学习的历程,知识点的认识,更是复习的一把神兵利器。2. 中后期画思维导图总结。原创 2023-03-20 10:43:09 · 552 阅读 · 0 评论