
C++
文章平均质量分 75
小wanga
须知少时凌云志,曾许人间第一流
展开
-
【C++】IO 流
class Apublic://explicit A(int a) // explicit不允许隐式类型转换A(int a):_a(a){}return _a;int main()// 内置类型转换成自定义类型A aa1 = 1;// 隐式类型转换 用1构造A临时对象,再拷贝构造aa1,优化后直接1构造aa1// 自定义类型转换成内置类型// 隐式类型转换,如果加上explicit,就会报错:不存在从A到int的适当转换函数// 强制类型转换。原创 2025-01-14 23:22:07 · 732 阅读 · 0 评论 -
【C++】STL 之空间配置器 | STL 总结
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。注:空间配置器是内存池。直接向堆区申请内存的有 Windows 下的 VirtualAlloc 和 Linux 下的 brk,这个一般不符合我们的需求。而 malloc 是向堆区申请内存的函数,也本质是一个内存池,可用于整个程序的内存管理。STL 的空间配置器也是内存池,其是专门服务 STL 容器的内存管理,以提高效率。原创 2025-01-10 16:18:42 · 900 阅读 · 0 评论 -
【C++】类型转换
👉C语言中的类型转换👈在 C 语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。原创 2025-01-09 14:02:42 · 707 阅读 · 0 评论 -
【C++】特殊类设计
拷贝只会发生在两个场景中:以及,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。C++98的做法是将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。原因:C++11的做法是C++11扩展了delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上=delete,表示让编译器删除掉该默认成员函数。👉设计一个只能在堆上创建对象的类👈实现方式:👉设计一个只能在栈上创建对象的类👈将构造函数私有化,然后设计静态方法原创 2025-01-07 21:04:07 · 1057 阅读 · 0 评论 -
【C++】智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。注:内存泄漏是指针丢了,并不是内存丢了,指针丢了就无法释放申请的内存了。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();原创 2025-01-06 22:08:53 · 990 阅读 · 0 评论 -
【C++】异常
如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。实际中 C 语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。异常是一种处理错误的方式,原创 2025-01-02 15:49:59 · 517 阅读 · 0 评论 -
【C++】lambda 表达式 | 包装器
实际在底层编译器对于 lambda 表达式的处理方式,完全就是按照函数对象的方式处理的,即如果定义了一个lambda 表达式,编译器会自动生成一个类,在该类中重载了 operator()。原创 2025-01-02 15:34:03 · 987 阅读 · 0 评论 -
【C++】右值引用和移动语义 | 新的类功能 | 可变参数模板
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址 + 可以对它赋值,原创 2024-12-29 20:37:41 · 987 阅读 · 0 评论 -
【C++】C++11简介 | 列表初始化 | 声明 | 范围for
在 2003 年 C++ 标准委员会曾经提交了一份技术勘误表(简称TC1),使得 C++03 这个名字已经取代了 C++98,称为 C++11 之前的最新 C++ 标准名称。不过由于C++03(TC1) 主要是对 C++98 标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为 C++98/03 标准。从 C++0x 到 C++11,C++ 标准十年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2024-12-26 10:34:21 · 1004 阅读 · 0 评论 -
【C++】位图 | 布隆过滤器
假设要存储某家公司员工登记表,如果用手机号作为关键字,那么极有可能前 7 位都是相同的,那么我们可以选择后面的四位作为散列地址,如果这样的抽取工作还容易出现 冲突,还可以对抽取出来的数字进行反转(如 1234 改成 4321 )、右环位移(如 1234 改成 4123 )、左环移位、前两数与后两数叠加(如 1234 改成 12+34=46 )等方法。选择一个随机函数,取关键字的随机函数值为它的哈希地址,即 H(key) = random(key),其中 random 为随机数函数。原创 2024-12-18 14:27:30 · 1024 阅读 · 0 评论 -
【C++】哈希表 | 闭散列 | 开散列 | underorded_map和underorded_set的模拟实现
unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value。在unordered_map中,键值通常用于唯一的标识元素,而映射值是一个对象,其内容与此键值关联。键值和映射值的类型可能不同。在内部unordered_map没有对<key, value>按照任何特定的顺序排序,为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。原创 2024-12-12 12:25:01 · 816 阅读 · 0 评论 -
【C++】map 和 set 的模拟实现
我们知道,map和set的底层数据结构都是红黑树,那库里是写了两份红黑树的代码来分别实例化出map和set吗?其实不是,而给一颗泛型结构的红黑树传不同的实例化参数,从而实现map和set。代表的是一段前闭后开的区间,而对红黑树进行中序遍历可以得到一个有序的序列。的左指针指向最小节点,右指针指向最大节点,父指针指向根节点,根节点的父指针指向。的迭代器也是封装了红黑树的迭代器的。红黑树的代码已经实现完了,那么现在就用红黑树实现出 map 和 set。现在红黑树的迭代器也实现完了,那么我们再来改造一下红黑树的。原创 2024-12-06 20:27:16 · 685 阅读 · 0 评论 -
【C++】红黑树
/用枚举常量来代表颜色enum ColurRED,BLACKColur _col;, _kv(kv){}总体来看,红黑树节点的定义是和 AVL 树节点的定义是差不多的,红黑树没有平衡因子,而有了节点的颜色。节点的颜色有很多种方式来表示,在这里我采用了枚举常量的形式。原创 2024-12-05 19:39:39 · 767 阅读 · 0 评论 -
【C++】AVL 树
/父节点//左孩子//右孩子// 键值对int _bf;// balance factor(平衡因子), _kv(kv), _bf(0){}AVL 树的节点是三叉链结构的,因为插入节点可能会影响父节点的平衡因子,有了指向父节点的指针会方便我们进行平衡因子的更新和旋转操作。新插入的节点的平衡因子都是 0。原创 2024-12-01 22:50:02 · 843 阅读 · 1 评论 -
【C++】map 和 set 的使用
set 是按照一定次序存储元素的容器。在 set 中,元素的 value 也标识它(value 就是 key,类型为 T),并且每个 value 必须是唯一的。set 中的元素不能在容器中修改(元素总是 const),但是可以从容器中插入或删除它们。在内部,set 中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set 容器通过 key 访问单个元素的速度通常比unordered_set 容器慢,但它们允许根据顺序对子集进行直接迭代。原创 2024-11-29 23:08:29 · 949 阅读 · 0 评论 -
【C++】二叉树进阶
情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题。1.2 二叉搜索树的特性了解,有助于更好的理解map和set的特性。情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点。情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点。1.若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;2.若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;b. 树不空,按二叉搜索树性质查找插入位置,插入新节点;原创 2024-11-19 13:49:24 · 375 阅读 · 0 评论 -
【C++】多态
需要声明的,本节中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2024-11-09 15:10:54 · 716 阅读 · 0 评论 -
【C++】继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构。体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了Student和Teacher复用了Person的成员。原创 2024-11-05 21:47:53 · 935 阅读 · 0 评论 -
【C++】stack和queue
stack的文档介绍翻译:1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:3.1 empty:判空操作;原创 2024-10-23 11:35:52 · 954 阅读 · 0 评论 -
【C++】List
文章目录1.list的介绍及使用1.1 list的介绍本节目标1.list的介绍及使用2.list的深度剖析及模拟实现3.list与vector的对比4.本节习题1.list的介绍及使用1.1 list的介绍原创 2024-10-08 09:44:01 · 507 阅读 · 0 评论 -
【C++】vector
1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2024-09-23 09:01:28 · 979 阅读 · 0 评论 -
【C++】OOP面向对象思想
面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将现实世界中的实体抽象为对象,通过对象之间的交互来设计软件系统。多态性是指允许不同类的对象对同一消息做出响应的能力,即同一个接口可以被不同的对象以不同的方式实现。抽象是简化复杂性的一种方式,它只关注对象的外部特征,而不是内部实现细节。接口是一种规范,它定义了对象必须实现的方法,但不定义这些方法的具体实现。类是创建对象的蓝图,它定义了对象的属性和方法。对象是类的实例,它是具有状态和行为的实体。原创 2024-09-04 11:56:49 · 725 阅读 · 0 评论 -
【C++_string】leetcode 415.字符串相加 _详解
你可能会想两个数字位数不同怎么处理,这里我们统一在指针当前下标处于负数的时候返回 0,等价于对位数较短的数字进行了补零操作,这样就可以除去两个数字位数不同情况的处理,具体可以看下面的代码。本题我们只需要对两个大整数模拟「竖式加法」的过程。竖式加法就是我们平常学习生活中常用的对两个整数相加的方法,回想一下我们在纸上对两个整数相加的操作,是不是如下图将相同数位对齐,从低到高逐位相加,如果当前位和超过 10,则向高位进一位?因此我们只要将这个过程用代码写出来即可。原创 2024-08-27 16:42:21 · 695 阅读 · 0 评论 -
【C++】类和对象习题
A、B为局部变量,在main函数结束前调用析构函数清理,A、B的析构函数调用顺序与构造函数相反。因为A在前面,B在后面,所以构造顺序:A、B;局部静态变量是在main函数结束后析构,所以顺序排在A后面。全局变量C最后析构。C为全局变量,在最前面,所以C肯定最先构造。因为D的代码行位置在B后面,程序执行到这里时才会构造D,所以D最后构造。析构函数的调用顺序为B、A、D、C;构造函数的调用顺序为C、A、B、D。这个选择题正确答案为A,原创 2024-08-20 13:51:38 · 318 阅读 · 0 评论 -
【C++】计算日期到天数转换
进阶:时间复杂度:O(n) ,空间复杂度:O(1)输入一行,每行空格分割,分别是年,月,日。根据输入的日期,计算是这一年的第几天。保证年份为4位数且日期合法。输出是这一年的第几天。原创 2024-08-19 14:20:58 · 551 阅读 · 0 评论 -
【C++】匿名对象知识点
匿名对象生命周期就在这一行,出了这一行,就会调用析构函数;只有我这一行会使用这个创建对象,别人不需要使用。s1的生命周期在main函数中。原创 2024-08-18 21:07:20 · 384 阅读 · 0 评论 -
【C++】classes and object 2.8 取地址及const取地址操作符重载
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比 如想让别人获取到指定的内容!这两个默认成员函数一般不用重新定义 ,编译器默认会生成。原创 2024-08-14 10:19:38 · 418 阅读 · 0 评论 -
【C++】类与对象(中)2.7 const成员函数
将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。我们来看看下面的代码。原创 2024-08-13 23:28:43 · 694 阅读 · 0 评论 -
【Effecutive C++】条款02 尽量以const, enum, inline替换 #define
如果ASPECT_RATIO被定义在一个非你所写的头文件内,你肯定对1.653以及它来自何处毫无概念,于是你将因为追踪它而浪费时间。此外对浮点常量(floating point constant,就像本例)而言,使用常量可能比使用#define导致较小量的码,因为预处理器“盲目地将宏名称ASPECT_RATIO替换为1.653”可能导致目标码(object code)出现多份1.653,若改用常量AspectRatio绝不会出现相同情况。那正是它的问题所在。原创 2024-08-06 09:12:06 · 820 阅读 · 0 评论 -
【Effecutive C++】条款01 视C++为一个语言联邦
今天的C++已经是个多重范型编程语言(multiparadigm programming language),一个同时支持过程形式(procedural)、面向对象形式(object-oritened)、函数形式(functional)、范型形式(generic)、元编程形式(metaprogramming)、的语言。我们该如何理解这样一个语言呢?Exceptions(异常)对函数的结构化带来不同的做法,templates(模板)将我们带到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。原创 2024-08-05 13:14:18 · 997 阅读 · 0 评论 -
【C++】引用和指针的不同点
5.在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)3.引用在初始化时引用一个实体后,就不能再引用其他实体;(从使用的角度去对比,按自己的理解的角度去梳理,硬记很难记全,虽然不赢记大概率也记不全)6.引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。8.访问实体方式不同,指针需要显示解应用,引用编译器自己处理。1.引用概念上定义一个变量的别名,指针存储一个变量地址。2.引用在定义时必须初始化,指针没有要求。原创 2024-07-29 23:31:50 · 842 阅读 · 0 评论 -
C++入门1_命名空间介绍
【代码】C++入门1_命名空间介绍。原创 2024-07-24 13:20:05 · 322 阅读 · 0 评论