c++
文章平均质量分 93
语法介绍
zl_dfq
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ 之 【C++的IO流】
int main()//自定义类型<-内置类型A aa1 = 1;//内置类型<-自定义类型return 0;成员函数 operator int 使得自定义类型能够隐式转换为内置类型 intexplicit 修饰构造函数,禁止隐式类型转换,仍可通过显式调用构造(A aa1(1);原创 2025-09-21 21:29:51 · 910 阅读 · 0 评论 -
C++ 之 【特殊类设计 与 类型转换】
目录1. 特殊类设计1.1 不能被拷贝的类1.2 只能在堆上创建对象的类1.3 只能在栈上创建对象的类1.4 不能被继承的类1.5 只能创建一个对象的类(单例模式)饿汉模式懒汉模式2. 类型转换2.1 C语言中的类型转换2.2 为什么C++需要四种类型转换2.3 C++强制类型转换static_castreinterpret_castconst_castdynamic_cast3. RTTI(了解)原创 2025-09-21 19:12:33 · 665 阅读 · 0 评论 -
C++ 之 【智能指针的简介】
weak_ptr不参与资源管理(不拥有资源,不控制生命周期)。weak_ptr不是 RAII(资源获取即初始化) 的实现,因为它不负责释放资源。weak_ptr不直接参与引用计数(不增加强引用计数,但通过弱引用计数辅助 shared_ptr 的控制块管理)。weak_ptr提供类似指针的访问行为(需通过 lock() 获取 shared_ptr 后解引用)。public::_ptr(ptr){}//sp1(sp2){}{}//1.指向同一块资源的指针没必要赋值。原创 2025-09-18 16:54:31 · 1083 阅读 · 0 评论 -
C++ 之【C++11的简介】(可变参数模板、lambda表达式、function\bind包装器)
一般而言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M 可以大于N,但这么做没什么意义)参数的新函数。lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。[&,a, this]:值传递方式捕捉变量a和this,引用方式捕捉其他变量。std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),作用:通用函数包装器,可以存储可调用对象(函数、Lambda、函数对象、成员函数等)原创 2025-09-15 17:55:40 · 964 阅读 · 0 评论 -
C++ 之 【C++11的简介】(列表初始化、decltype、右值引用和移动语义、完美转发、移动构造函数、移动赋值重载函数、=delete、default)
可添加等号(=),也可不添加。原创 2025-09-15 17:13:17 · 1065 阅读 · 0 评论 -
C++ 之 【unordered_map 和 unordered_set 的模拟实现】(只涉及插入、迭代器以及unordered_map 的operator[ ]函数)
unordered_map 和unordered_set 底层是哈希表,即下面使用的是在上一期博客的基础上进行迭代更新的。原创 2025-09-07 14:08:51 · 648 阅读 · 0 评论 -
C++ 之 【map和set的模拟实现】(只涉及map和set的插入、迭代器以及map的operator[]函数)
map和set底层是红黑树,即下面使用的红黑树是在上一期博客模拟实现的红黑树的基础上进行迭代更新的。原创 2025-08-30 20:56:10 · 902 阅读 · 0 评论 -
数据结构 之 【AVL树的简介与部分实现】(部分实现只涉及AVL树的插入问题,包括单旋((右单旋、左单旋))、双旋(左右单旋、右左单旋)等操作)
/模板,以适应不同数据类型struct AVLTreeNode//struct定义,将节点暴露方便后续使用//三叉链//键值与平衡因子K _key;int _bf;//new一个新节点时需要调用节点的构造函数{ }//其余默认构造使用编译器自动生成的即可,这里暂且不用手写,也用不到这个类负责树节点的定义及初始化:(1)使用模板,以适应不同数据类型(2)struct定义,将节点暴露方便后续使用(3这里使用三叉链,即一个节点既保存其左右孩子节点指针又保存其父亲节点指针。原创 2025-08-23 19:47:37 · 897 阅读 · 0 评论 -
C++ 之 【异常】
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家 随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;原创 2025-08-18 09:40:03 · 896 阅读 · 0 评论 -
C++ 之 【简介 set、multiset、map、multimap 的使用】
set容器实际上就是二叉搜索树应用中说的K模型T: set中存放元素的类型(实际在底层存储的键值对)Compare(仿函数):set中元素默认按照小于来比较Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理(后续讲解)set容器实际上就是二叉搜索树应用中说的KV模型key: 键值对中key的类型T: 键值对中value的类型Compare(仿函数。原创 2025-08-14 18:01:31 · 734 阅读 · 0 评论 -
二叉树进阶 之 【二叉搜索树】(包括二叉搜索树的应用、性能及重要OJ)
结构中只需要存储Key比如:给一个单词word,判断该单词是否拼写正确,具体方式如下:以词库中所有单词集合中的每个单词作为key,构建一棵二叉搜索树在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。原创 2025-08-12 17:23:52 · 716 阅读 · 0 评论 -
二叉树进阶 之 【模拟实现二叉搜索树】(递归、非递归实现查找、插入、删除功能)
替换之后,需要删除的节点就变为了左子树或右子树中键值与删除节点替换前的键值一致的节点,所以,在查找左子树的最大键值或右子树的最小键值仍。树为空,root 是 _root 的别名,root 指向 新创建的节点,_root 也指向 新创建的节点。树不为空时,位置的查找与前面讲的节点的查找差不多,只是,找到插入位置后,我们不仅。选用删除节点的左子树的最大键值或右子树的最小键值与删除节点的键值进行替换操作。正如删除键值为 6 的树节点一样,只需让父亲节点指向右子树,但是,原创 2025-08-11 16:00:14 · 1041 阅读 · 0 评论 -
二叉树进阶 之 【二叉搜索树的简介与模拟实现的前提准备】
的,最小子问题是空树二叉搜索树主要有。原创 2025-08-10 20:53:36 · 885 阅读 · 0 评论 -
C++ 之 【反向迭代器的简介与简单模拟实现】
通过对给定的正向迭代器的封装,C++将反向迭代器设计为一种迭代器适配器以实现其反向遍历容器的功能反向迭代器与普通迭代器的遍历方向相反,但提供相同的接口(如operator*operator++等),使得反向遍历的代码风格与正向遍历一致如上,反向迭代器设计的始末位置与正向迭代的始末位置互为镜像对称这一特点在后续的解引用操作设计上会有体现。原创 2025-08-03 15:12:48 · 1153 阅读 · 0 评论 -
C++ 之 【模拟实现 优先级队列】
less、greater已经满足大多数优先级队列的创建要求,但还是有些例外,如下public:{}private:int _year;int _month;int _day;上述代码是自定义类型Date类while (!pq.pop();while (!pq1.pop();上述测试用例中,pq存储的类型是Date,而Date类重载了>、<运算符,使得pq得以根据需要进行创建pq1存储的类型是Date*,仿函数的对象实例只会根据地址大小创建优先级队列,原创 2025-08-03 11:54:13 · 873 阅读 · 0 评论 -
C++ 之 【优先级队列、仿函数的简介】
在C++中,(优先级队列)是一个容器适配器,它默认使用和堆算法实现优先级队列的功能。优先级队列的底层数据结构可以视为堆,但优先级队列本身是更高层次的抽象。原创 2025-08-03 10:18:15 · 513 阅读 · 0 评论 -
C++ 之 【deque(双端队列)的简介】
deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和 删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比 较高双端队列底层是一段假象的连续空间,实际是分段连续的通常从中控数组(指针数组)的中间元素所指向的buffer开始存储数据,尾插就是在buffer中从前往后存放数据,一个buffer满了就再创建一个相同的buffer进行存储此时,指向新的buffer的指针放在中控数组的逻辑末尾。原创 2025-06-30 11:09:29 · 870 阅读 · 0 评论 -
C++ 之 【队列的简介 与 模拟实现】
队列是一种数据结构,也是一种特殊的线性表队列只允许在一端进行插入数据操作,在另一端进行删除数据操作。原创 2025-06-30 10:24:29 · 571 阅读 · 0 评论 -
C++ 之 【栈的简介 与 模拟实现】
栈是一种,是一种特殊的线性表,原创 2025-06-30 09:46:18 · 382 阅读 · 0 评论 -
C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】
需要声明的,这期博客的代码及解释都是在vs202022下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题 等等。原创 2025-06-01 19:32:45 · 934 阅读 · 0 评论 -
C++ 之 多态【多态的概念、多态构成的条件、虚函数的概念、虚函数的重写、override\final、重载重定义重写的对比、抽象类的概念、接口继承与实现继承】
多态是在不同继承关系的类对象去调用同一函数时,产生的不同的行为那么在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用去调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写public:cout << "票价-成人票" << endl;public:cout << "票价-学生票" << endl;Func(&p);Student s;Func(&s);return 0;(1)重载就是指。原创 2025-05-31 14:58:40 · 785 阅读 · 0 评论 -
C++ 之 【模板进阶(非类型模板参数、模板的特化、模板的分离编译、模板中的嵌套类型)】
这是最常见的做法。将模板的完整定义(包括实现)放在头文件中,这样任何包含该头文件的源文件都能看到完整的模板定义,从而能够实例化所需的模板既可以完整实现。原创 2025-05-25 13:44:03 · 757 阅读 · 0 评论 -
C++ 之 继承【.继承的概念及定义、基类和派生类对象的赋值转换、继承中的作用域、派生类的默认成员函数、继承和友元、继承和静态成员、菱形继承及菱形虚拟继承、继承的反思与总结】
Person是父类,也称作基类。Student是子类,也称作派生类(1)可以实现多继承,但一定不要设计出菱形继承。否则在复杂度及性能上都有问题继承与组合(1)public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象组合是一种has-a的关系。假设B组合了A,每个B对象中都有一个A对象(2)在继承方式中,基类的内部细节对子类可见。继承一定程度破坏了基类的封装,基类的改变,对派生类有很 大的影响组合类之间没有很强的依赖关系,实际尽量多去用组合。原创 2025-05-18 20:43:47 · 735 阅读 · 0 评论 -
C++ 之 【模拟实现 list(节点、迭代器、常见接口)】(将三个模板放在同一个命名空间就实现 list 啦)
此时,该迭代器类的对象就是链表的迭代器。原创 2025-04-28 17:31:13 · 1113 阅读 · 0 评论 -
C++ 之 【list的简介、list 的构造函数、iterator、容量操作、元素访问、增删查改与迭代器失效】
(1)的底层通常实现为,支持在任意位置插入、删除。原创 2025-04-28 13:53:07 · 790 阅读 · 0 评论 -
C++ vector 之 【模拟实现vector须知、完整的模拟实现 】
vector是一个类模板所以模拟实现时,我将在.h文件中完整模拟实现vector(3)vector可以被理解为一个动态数组,模拟实现一个动态数组时,我们选择在堆上去申请空间,原创 2025-04-20 17:10:46 · 1194 阅读 · 0 评论 -
C++ 之 【vector的4种构造函数、vector iterator 的使用、vector 的空间问题、vector 的增删查改、vector中的迭代器失效问题】
vector是一个类模板vector是表示动态数组的序列容器,元素在内存中连续存放,支持通过下标直接访问(1) 显而易见,vector类似于静态数组但无需固定大小,因为它能"自动"管理内存大小当元素数量超过当前容量时,自动分配更大的连续内存(通常按 1.5~2 倍增长),并将原有元素迁移至新空间(2)除此之外,vector还提供了多种成员函数来操作元素,如pop_back()insert()erase()size()capacity()等。原创 2025-04-20 12:18:29 · 1103 阅读 · 0 评论 -
模拟实现string类(声明与定义分离)
(2)原创 2025-04-10 12:14:33 · 916 阅读 · 0 评论 -
string类 之 【常用接口简介】本文的代码示例都已包含头文件且展开了命名空间std
size()返回字符串中字符的数量(长度),以字节为单位。// 输出5length()功能与size()相同,返回字符串的长度。// 输出5capacity()返回当前为字符串分配的存储空间大小(容量),以字节为单位。// 输出20empty()检查字符串是否为空,若为空返回true,否则返回false。// 输出1(true)clear()清空字符串内容,将其长度置为0,但保留已分配的存储空间。// 输出0reserve()预留至少n个字符的存储空间,避免频繁的内存重新分配,提高性能。原创 2025-04-09 17:20:03 · 1023 阅读 · 0 评论 -
C++之 【模板初阶(函数模板与类模板)】
类模板是一个与具体数据类型无关的通用类定义具体来说就是,类模板代表了一个类家族该类模板中的类型被参数化,编译器根据实参类型产生类的特定类型版本。原创 2025-03-22 15:13:00 · 1050 阅读 · 0 评论 -
C/C++内存管理(new、delete)
(1)对于单个对象空间的开辟与释放,delete p2;new 类名-即可完成空间的开辟,再创建指针变量接收该空间的地址就好想要在开辟空间的同时进行初始化类名后面加上 (初始值,..)即可注意此处传参实际上是传给构造函数,传参的实际情况根据构造函数而定delete 指针名-即可完成空间的释放(1)申请和释放多个对象,new 类名[size]-即可完成连续空间的开辟,再创建指针变量接收该空间的地址就好想要在开辟空间的同时进行可以全部对象都进行初始化,也可以部分对象进行初始化。原创 2025-03-21 17:30:49 · 649 阅读 · 0 评论 -
C++类和对象之 【日期类的实现】(.h文件中声明,.cpp文件中定义)
(1)重载+, 会创建两个临时对象,所以我们选择在 重载+ 时去复用+=(1)默认大日期、默认小日期,用max、min替换(使代码更简洁)(1)创建一个数组存放每一个月的天数,判断闰年返回即可。(1)因为大小比较时,日期对象不会发生改变,加上。只需写一个判断小于的函数和一个判断等于的函数。(1)先判断是否是2月,在判断是否是闰年,调用任意一个运算符都会进行对象的创建,代码。(2)临时对象的创建,注意返回值类型即可。(1)this指针在函数体中的使用。(1)为了连续的输入输出,需要。原创 2025-03-19 17:28:27 · 669 阅读 · 0 评论 -
C++类和对象(下) 之 【初始化列表、explicit关键字、static成员、友元、内部类、临时对象】
声明为static的类成员称为类的静态成员用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化用static修饰的 成员函数,称之为静态成员函数在C++中,友元(friend)是一种机制它允许一个类或函数访问另一个类的私有(private)和保护(protected)成员。友元不是类的成员函数,但它可以像类的成员函数一样访问类的私有和保护成员。友元关系打破了类的封装性,因此在使用时需要谨慎----文心一言友元分为友元类和友元函数创建一个对象,该对象没有名字,形如。原创 2025-03-18 17:06:50 · 951 阅读 · 0 评论 -
C++类和对象(中) 之 【运算符重载、赋值运算符重载、前置++与后置++、const成员、取地址及const取地址操作符重载】
时,往往会遇到。原创 2025-03-14 19:38:31 · 858 阅读 · 0 评论 -
C++类和对象(中) 之 【构造函数、析构函数、拷贝构造函数】
用户有定义构造函数之后编译器当然要选择不再生成构造函数,不然当编译器自动生成的无参构造函数与用户显式定义的无参或全缺省函数冲突时,编译器该调用哪个构造函数呢?(1)析构函数不能被重载,这是因为它没有参数且无返回值(1)如果一个类中有多个析构函数,可能会导致同一块内存被多次释放、编译器无法确定该调用哪一个析构函数等未定义行为class Timepublic:Time()_hour = 14;原创 2025-03-11 15:07:48 · 919 阅读 · 0 评论 -
C++类和对象(上) 之 【封装与类的语法特点、定义、访问限定符、对象模型与this指针】
C语言中,定义一个自定义类型需要用到关键字structC++兼容C语言,定义一个自定义类型也可以用 struct但C++更喜欢用class来替代class 类型名//类体(1)如上,就定义了一个类(1)class是定义类的关键字(1)注意结尾的分号类体中的内容叫作类中的变量叫作类的属性或成员变量类中的函数叫作类的方法或成员函数成员函数在类中定义,可能会被编译器当作内联函数进行处理2.声明放在.h文件中,定义放在.cpp文件中,注意:在.cpp文件中定义的函数需要在函数名前加上。原创 2025-03-07 20:11:50 · 733 阅读 · 0 评论 -
C++入门 之 【内联函数、C++11中的auto、基于范围的for循环与指针空值 nullptr】
因为被编译器视为内联函数的函数体会被直接展开编译器在编译阶段将该函数体展开而。原创 2025-03-04 15:02:40 · 497 阅读 · 0 评论 -
C++入门 之 【缺省参数、函数重载、引用】
这是规定因为形参的缺省值如果同时出现在了定义与声明中并且两处缺省值不同编译器则无法确认谁才是真正的缺省值,所以为了简化问题起见,直接规定缺省参数不能在定义和声明同时出现, 就会省事很多引用变量的定义: 类型& 引用变量名 = 引用实体int a = 10;int& b = a;第二行代码就定义了一个引用变量b,此时的b就是a的别名(引用)a、b共同代表了10定义一个引用变量时,类型& 引用变量名 = 引用实体类型和引用实体的类型必须保持一致,否则会报错,会丢失数据等。原创 2025-03-03 19:16:35 · 672 阅读 · 0 评论 -
c++入门之 命名空间与输入输出
命名空间可以用来避免命名冲突命名空间形如:关键字 加 空间名称 + { 主体 }命名空间可以定义函数/变量/类型命名空间可以嵌套......一个命名空间就定义了一个作用域在一个项目中,可以存在多个相同名称的命名空间,编译运行后,分散的变量/类型/函数,共同局限在一个作用域里面。原创 2025-01-10 23:12:02 · 978 阅读 · 0 评论
分享