
C++
文章平均质量分 90
五花肉村长
流水不争先,争的是滔滔不绝。
展开
-
C++11 智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释 放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分 配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。内存泄漏的危害:普通程序运⾏⼀会就结束了出现内存泄漏问题也不⼤,进程正常结束,⻚表的映射 关系解除,物理内存也可以释放。原创 2024-12-21 20:33:27 · 1261 阅读 · 0 评论 -
C++11 异常
• 异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理, 异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后 解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。• C语⾔主要通过错误码的形式处理错误,错误码本质就是对错误信息进⾏分类编号,拿到错误码以 后还要去查询错误信息,⽐较⿇烦。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。原创 2024-12-21 11:17:00 · 956 阅读 · 0 评论 -
C++11(2)
• 对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个 包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元 素应⽤模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(...)来触发扩展操作。底层 的实现细节如图1所⽰。• C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。原创 2024-12-20 21:25:06 · 715 阅读 · 0 评论 -
C++ 11(1)
emplace系列兼容push系列和insert的功能,部分场景下emplace可以直接构造,push和insert是构造+移动构造或构造+拷贝构造,所以emplace综合而言更好用更强大,推荐使用emplace系列替代push和insert。原创 2024-12-20 20:45:49 · 1021 阅读 · 0 评论 -
C++ 哈希表封装unordered_map 和 unordered_set
SGI-STL30版本源代码中没有unordered_map和unordered_set,SGI-STL30版本是C++11之前的STL 版本,这两个容器是C++11之后才更新的。但是SGI-STL30实现了哈希表,只容器的名字是hash_map 和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在 hash_map/hash_set/stl_hash_map/stl_hash_set/stl_hashtable.h中。原创 2024-12-17 20:32:50 · 717 阅读 · 0 评论 -
C++ 哈希表的实现
哈希(hash)⼜称散列,是⼀种组织数据的⽅式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建⽴⼀个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进 ⾏快速查找。原创 2024-12-11 20:52:38 · 968 阅读 · 0 评论 -
C++ unordered_map和unordered_set的使用
• unordered_set的声明如下,Key就是unordered_set底层关键字的类型• unordered_set默认要求Key⽀持转换为整形,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀ 持将Key转成整形的仿函数传给第⼆个模板参数• unordered_set默认要求Key⽀持⽐较相等,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现⽀持 将Key⽐较相等的仿函数传给第三个模板参数。原创 2024-12-10 21:34:55 · 843 阅读 · 0 评论 -
C++ 红黑树封装实现myset 和mymap
SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等⼏个头⽂件 中。map和set的实现结构框架核⼼部分截取出来如下:• 通过下图对框架的分析,我们可以看到源码中rb_tree⽤了⼀个巧妙的泛型思想实现,rb_tree是实 现key的搜索场景,还是key/value的搜索场景不是直接写死的,⽽是由第⼆个模板参数Value决定 _rb_tree_node中存储的数据类型。原创 2024-12-10 14:59:45 · 807 阅读 · 0 评论 -
C++ 红黑树
红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路 径⻓出2倍,因⽽是接近平衡的。原创 2024-12-09 20:31:57 · 1119 阅读 · 0 评论 -
C++ AVL树
• AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的 左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树, 通过控制⾼度差去控制平衡。• AVL树得名于它的发明者G.M.Adelson-Velsky和E.M.Landis是两个前苏联的科学家,他们在1962 年的论⽂《An algorithm for the organization of information》中发表了它。原创 2024-12-06 21:02:24 · 565 阅读 · 0 评论 -
C++ map和set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模 版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参 数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序 的。原创 2024-12-05 21:22:23 · 781 阅读 · 0 评论 -
C++ 二叉搜索树
⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:• 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值• 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值• 它的左右⼦树也分别为⼆叉搜索树• ⼆叉搜索树中可以⽀持插⼊相等的值,也可以不⽀持插⼊相等的值,具体看使⽤场景定义,后续我 们学习map/set/multimap/multiset系列容器底层就是⼆叉搜索树,其中map/set不⽀持插⼊相等 值,multimap/multiset⽀持插⼊相等值。原创 2024-12-05 20:37:22 · 1032 阅读 · 0 评论 -
C++ 多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了 Person。Person对象买票全价,Student对象优惠买票。原创 2024-11-28 16:56:11 · 861 阅读 · 0 评论 -
C++ 继承
下⾯我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以 既叫基类/派⽣类,也叫⽗类/⼦类)原创 2024-11-27 17:01:36 · 1088 阅读 · 0 评论 -
C++ 模版(进阶)
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有 目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。优点:1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性缺点:1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-11-19 21:37:57 · 659 阅读 · 0 评论 -
C++ stack 和 queue
queue的文档介绍翻译:1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元 素,另一端提取元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供 一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少 支持以下操作:empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用。原创 2024-11-19 15:14:14 · 1125 阅读 · 0 评论 -
C++ list
因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入 时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭 代器,其他迭代器不会受到影响。通过前面例子知道,反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++, 因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对 正向迭代器的接口进行包装即可。此处,大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。原创 2024-11-18 10:21:08 · 363 阅读 · 0 评论 -
C++ vector
迭代器是一种封装的体现,屏蔽了底层的实现细节,提供了统一的类似访问容器的方式,不需要关心容器底层结构和实现细节,底层类似于指针但实际上不是指针,不是所有的容器的迭代器都是原生指针,容器的底层有的是数组有的是链表,物理结构上有的不连续,指针解引用也不是真实值。原创 2024-11-07 15:27:07 · 717 阅读 · 0 评论 -
C++ String
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列 的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户 自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、 快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。原创 2024-11-03 21:20:27 · 1027 阅读 · 0 评论 -
C++ STL
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的 组件库,而且是一个包罗数据结构与算法的软件框架。STL主要包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Function Objects)四个部分。这些组件可以相互协作,提供高效、灵活的数据处理功能。原创 2024-11-01 21:09:26 · 651 阅读 · 0 评论 -
C++ 模版(初阶)
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的 类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。原创 2024-11-01 20:39:53 · 368 阅读 · 0 评论 -
C/C++内存管理
1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数,完成对象的构造。原创 2024-11-01 15:16:30 · 997 阅读 · 0 评论 -
C++类和对象(下)
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表;⽆论是否在初始化列表显⽰初始化,每个成员变量都要⾛初始化列表初始化;const修饰的变量只有一次赋值初始化的机会,就是在它定义的时候,必须在定义的时候初始化,之后不能改变通俗的讲,声明是告诉我们有这个东西,定义是木已成舟,已经开空间了。声明的顺序也就是在内存当中从上到下存放的顺序。原创 2024-10-28 14:43:28 · 639 阅读 · 0 评论 -
C++类和对象(中)
默认成员函数就是⽤⼾没有显式实现,编译器会⾃动⽣成的成员函数称为默认成员函数。⼀个类,我 们不写的情况下编译器会默认⽣成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最 后两个取地址重载不重要,我们稍微了解⼀下即可。其次就是C++11以后还会增加两个默认成员函数, 移动构造和移动赋值,这个我们后⾯再讲解。默认成员函数很重要,也⽐较复杂.我们要从两个⽅⾯ 去学习:• 第⼀:我们不写时,编译器默认⽣成的函数⾏为是什么,是否满⾜我们的需求。原创 2024-10-23 17:17:31 · 826 阅读 · 0 评论 -
C++ 类和对象(上)
• class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省 略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或 者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_或者m 开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。原创 2024-10-22 18:27:08 · 764 阅读 · 0 评论 -
C++基础知识(2)
• ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。• inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。原创 2024-07-27 18:40:28 · 345 阅读 · 0 评论 -
C++ 基础知识(1)
• 定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。• namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。原创 2024-07-09 20:25:34 · 864 阅读 · 0 评论