- 博客(52)
- 收藏
- 关注
原创 C++ STL简单的几个容器
Hello!!大家早上中午晚上好!!本文将介绍几个使用了适配器的容器的使用方法和模拟实现,例如:stack、queue、priority_queue!!
2025-04-02 23:33:09
442
原创 C++ List的模拟实现
/节点的定义(定义成模版可以接受各种类型)T _data;public:void emptyinit()//对空链表的初始化_size = 0;while (it!++_size;delete cur;--_size;
2025-03-30 17:42:55
382
原创 C++ Vector的模拟实现
需要注意迭代器失效的问题,当扩容的时候,资源已经转移到另一块空间pos指向的位置也要跟着改变;!!!咱下期见!!!
2025-03-24 13:08:34
417
原创 C++ STL序列式容器之二 - - Vector
vector是可以改变大小的数组;明确数组:同一类型的元素的集合;明确可改变大小:当你存储数据时,会根据你存储的内容改变数组大小,也就是会自动扩容;总结:vector是会自动扩容的同一类型的元素的集合!
2025-03-22 16:23:19
902
原创 C++ STL序列式容器之一 string
普通对象可对最后一个字符进行访问和修改操作;对const对象只能访问;int main()//报错return 0;跟back的操作类似;int main()//普通对象return 0;int main()//const对象//报错return 0;
2025-03-19 17:36:28
734
原创 C++ 类型转换
注意 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是 否还有其他不同的方法达到同一目的,如果R非强制类型转换不可,则应限制强制转换值的作用 域,以减少发生错误的机会。强烈建议:避免使用强制类型转换!三、RTTI(了解)3.1、
2025-03-18 17:25:41
865
原创 C++11 lambda表达式、包装器、Bind绑定
捕捉列表](参数列表)->返回值{函数体};捕捉列表:捕捉上下文的变量供lambda函数使用可省略;参数列表:与普通函数的参数列表一样,如果没有可省略;->:可省略;返回值:如果为空或已确定返回类型,可省略;函数体:如果没有要写的也可省略;最简洁的lambda表达式: []{};包装器是函数适配器,用来包装可调用对象,包装器实质是一个模版:包装器的头文件: <functional>其中Ret是返回类型,Args...是可变参数;
2025-03-17 22:25:06
437
原创 C++11 emplace_back和push_back区别
Hello!!大家早上中午晚上好!!今天我们来看看emplace_back到底是什么?
2025-03-16 17:40:43
575
原创 C++11 右值引用和移动语义(2)
1、万能引用只存在模版,当在模版里设置参数为&&时代表的不是右值引用,而是既可以接收左值也可以接受右值:(如果传进来是右值它就是右值引用,如果传进来是左值它就会发生引用折叠变成左值引用);2、万能引用+引用折叠=完美转发的产生!!这些条件缺一不可!3、完美转发的作用是让参数保持它传入进来前的属性!!
2025-03-15 01:58:14
896
原创 C++11 右值引用和移动语义
可以取地址的值,赋值符号左边的值;return 0;不可以取地址的值,赋值符号右边的值;//报错return 0;左值引用就是给在左值取别名;int& b = a;return 0;a是左值,b给a区别名,b是a的左值引用;右值引用就是给右值取别名;(语法:&& )int main()int a = 10;return 0;
2025-03-14 01:03:03
658
原创 C++ 多态★★★★★★★
简单的来说,多态就是多种形态,不同的对象去完成某个行为会产生不同的状态;//一个简单的虚函数class Apublic:Fun1()就是一个虚函数,条件:被virtual修饰+必须在类内!重写也叫覆盖,重写必须是虚函数,只有虚函数才能被重写!虚函数的重写(覆盖):在子类中定义了一个跟基类完全一样的虚函数(即:函数名、参数列表、返回类型完全相同)public:virtual void Fun1()//三同:函数名、返回类型、参数列表此时我们称子类的Fun1()重写父类的Fun1();
2025-03-10 18:04:16
972
原创 C++ 继承(2)
回观整个问题产生及解决过程:继承衍生出多继承 -> 多继承衍生出菱形继承 -> 菱形继承衍生出数据冗余以及二义性的问题 -> 解决办法虚拟继承 -> 虚拟继承实现原理 -> 利用虚基表指针 -> 虚基表存放偏移量 -> 通过指针访问解决问题!!因此解决菱形继承问题是非常复杂的过程,在我们以后的程序设计尽量避免设计成菱形继承!!!组合就是在类里面直接使用定义好的类,不需要继承!
2025-03-09 14:28:17
493
原创 C++ 继承★★★★★
class Person //基类public:char _name[10]="张三";//姓名//电话protected:char _sex[5] = "男";//性别private:char _adress[10]="中国";//地址class Student:public Person //公有继承Person的派生类 Studentpublic://学号char _major[10]="数学";//专业int main()Student s1;
2025-03-08 17:17:07
636
原创 C++ 模版★★★
模版是泛型编程的基础 -> 什么是泛型编程?-> 代码复用的一种手段 -> 什么手段?-> 编写与类型无关的通用代码,所以模版就是一段与类型无关的通用代码!函数模版代表了一个函数家族,该函数模版与类型无关,使用时被参数化,根据实参类型生成特定类型的函数;class 类模版名//类成员template <class T>//template(关键字) + <class/typename T(T是根据传入的类型实例化出对应的类型)>class Apublic:A(T a,T b)_a = a;
2025-03-07 15:12:17
493
原创 C/C++ 内存管理(2)
delete p2;return 0;运行:对于申请单个空间,new自定义类型会在new的时候调用构造函数创建对象,在delete的时候调用析构函数清理对象资源;malloc和free跟申请释放内置类型没区别;delete[]p2;return 0;
2025-03-06 15:35:54
1087
原创 C++ 类和对象(下)
以冒号开始,逗号分隔成员列表,成员变量后面紧跟括号,括号里放的是初始值或表达式例:一个简单的初始化列表//初始化列表class Apublic:private :int _a;int _b;友元突破了类的封装特性,使其使用起来更方便,但同时增加程序的耦合度,破坏封装,因此友元不宜多用!!
2025-03-04 16:19:53
943
原创 C++ 类和对象(中)
/空类什么都没有吗?class A{};当我们没有显式定义的时候,类里面包含了六个默认成员函数,其中我们需要重点掌握前4个构造函数是特殊的成员函数,是用来初始化对象的①构造函数函数名与类名相同;②构造函数没有返回值;③对象实例化的时候自动调用;④构造函数可以重载class Apublic:A(int a,int b)//显式定义的构造函数,对对象的成员变量初始化工作_a = a;_b = b;int _b;int main()
2025-03-03 16:19:37
898
原创 C++ 类和对象(上)
类定义关键字class类名+{//括号体类定义成员变量或成员函数}+;分号必须要写上//类的定义//成员变量或成员函数其中{}里的内容是称为类体,类体内定义的变量称为成员变量或类的属性,类体内定义的函数称为成员函数或类的方法;①声明和定义全部放在类体内//.h文件public:private:int _id;//学号//姓名//班级②声明和定义分离//在.h文件声明public:private:int _id;//学号//姓名//班级//在.cpp文件定义。
2025-03-02 15:30:14
589
原创 C++入门基础之引用(复习)
Hello!!大家早上中午晚上好,今天我们来复习C++入门基础篇之引用!!!例:2、引用必须初始化!不初始化会报错;例:运行:可以这么理解,pa就是a,pa只能是a,a改变影响pa,pa改变影响a;编译报错:对于const 常变量必须要用const 引用不然编译会报错因为这里涉及的是权限的放大,权限可以缩小但不能放大例:这里从int到const int是权限的缩小,所以没问题;例:对于以上情况如果用test1传值传参每次调用test1都会生成一份a的临时拷贝,调用10
2025-03-01 00:28:47
237
原创 C++入门基础(复习)
前提条件:在同一作用域下函数名相同!满足以下其中一个条件就构成函数重载:①函数名相同,参数个数不同;②函数名相同,参数类型不同;③函数名相同,参数个数相同参数类型顺序不同;跟返回值无关1.2 示例//参数个数不同void fun()int main()fun();fun(1);return 0;运行:int main()fun(1);fun(1.4);return 0;运行:int main()fun(1,1.4);fun(1.4,1);
2025-02-28 01:16:56
788
原创 C/C++(复习版) 数据存储
当一个数据进行存储时,数据的低字节序存储在内存的低地址,高字节序存储在内存的高地址,那么这台机器的数据存储方式为小端存储;当一个数据进行存储时,数据的低字节序存储在内存的高地址,高字节序存储在内存的低地址,那么这台机器的数据存储方式为大端存储;
2025-02-27 17:15:29
294
原创 C/C++ (复习版)-三个自定义类型****
联合体是一种特殊的自定义类型;①联合体的成员共用一个空间;②联合体的大小最少是最大成员的大小,当最大成员不是最大对齐数的整数倍就要对齐到最大对齐数的整数倍;③联合体关键字 union;int b;int d;//以上分别打印的是多少?u1的a为5字节,b为4字节,u1大小取最大成员大小5字节,5字节不是最大对齐数(4)的整数倍,对齐到4的整数倍等于8;
2025-02-27 13:11:00
1032
原创 C/C++(复习版) - C语言中重要的库函数模拟实现
可以看出,strstr如果str1中找到了字符串str2,返回的是找到的那个字符串的起始位置!对于内存重叠的拷贝要分情况处理,否则会覆盖掉原来的值,拷贝的内容不正确。
2025-02-25 23:07:26
910
原创 C/C++第一大模块C语言(复习版)
以下定义都是正确的:按以下方式创建的数组就是二维数组,(二维数组就是一维数组的扩展)像这样就是一个二维数组:我们可以理解为这是一个由三个一维数组(每个一维数组均有4个元素,每个元素是int类型)组成的二维数组,或者可以理解为这是一个3行4列的int类型的二维数组。指针是用来存放地址的一个变量,这个变量指向的是内存地址;解引用指针变量得到的是这个地址所指向的内容在内存中输入&p1可以看到,p1的地址指向的是cc90fa34这个地址;
2025-02-23 17:54:55
241
原创 C++ 定制删除器
定制删除器一般作用于shared_ptr和unique_ptr,当析构写死了delete的方式释放资源时,如果资源是new[]出来的(new数组),delete于new[]不匹配,会发生不可预知的错误,或者当资源是malloc出来的与delete也不匹配。所以要用定制删除器解决这个问题,这个定制删除器相当于仿函数,只需要当智能指针构造的时候同时传入仿函数(定制删除器即可)可以看出传了定制删除器后,针对不同的开辟资源的方式采用不同的释放方式,成功释放所有开辟出来的资源!首先明白我们用定制删除器是用来解决单一的
2025-02-20 14:58:23
400
原创 C++智能指针(3)shared_ptr (续)
思路:①当一块资源刚被开辟出来的时候,只有一个智能指针在管理,这个时候引用计数为1;②每多来一个智能指针共同管理块这块资源的时候,这块资源的引用计数+1;③每当某一个智能指针去管理其它资源或者直接走了啥也不管的时候,这块资源的引用计数需要-1并且当这块资源的引用计数减到0的时候就要被释放掉;图解:④每一块资源都应该有一个唯一的引用计数,不同资源间的引用计数互不影响,只有某一个智能指针去管理别的资源或者离开了引用计数才会-1,所以每一个智能指针它在管理一块资源的时候同时在管理这块资源的引用计数;
2025-02-18 16:19:16
237
原创 C++智能指针(3)- shared_ptr
前文写到unique_ptr不支持拷贝,所以shared_ptr应用而生,shared_ptr可很好的支持拷贝与赋值。
2025-02-16 00:57:36
352
原创 C++之智能指针(2)
前文写到auto_ptr,这个智能指针是c++98出来的,这个指针存在一个隐患就是当进行拷贝后,被拷贝对象管理的资源会被悬空,当使用者不知道情况下可能会对空指针的访问,就会出现问题。为了解决这个问题,unique_ptr出来了,unique_ptr直接禁止拷贝跟赋值操作;它是如何实现的呢?其实很简单,只要禁止使用拷贝构造跟赋值函数就行运行结果:当调用拷贝构造时编译会报错:
2025-02-15 11:59:14
228
原创 C++11 之智能指针(1)
1.智能指针三大特性之一:RAII(Resource Acquisition Is Initialization )(资源获取即初始化),简单来说就是借助对象的生命周期来对资源进行管控,当对象构造时获取资源,当对象析构时自动释放资源;2.智能指针三大特性之二:像指针一样,能解引用操作、能对指针指向的内容进行修改操作;3.智能指针三大特性之三:不同的智能指针对拷贝、赋值操作的不同处理;
2025-02-14 13:13:54
120
原创 c++11 异常(1)
1.异常是对错误信息的处理;2.异常是通过抛出对象引发的,该对象类型决定了该激活那个catch的处理代码;3.抛异常可抛出任意类型,抛出的类型只有跟catch匹配了才会捕获,抛出的异常必须被捕获;4.抛异常会生成异常对象的拷贝;5.throw异常会跳到离他最近的catch的位置,如果到达main主函数还没有被捕获就会终止程序;
2025-02-13 14:21:06
95
原创 AVLTree(平衡二叉搜索树)的理解与总结
当以有序或接近有序的数据来建立二叉搜索树时,二叉搜索树将退化为单支树,其查找数据的过程相当于在顺序表中查找数据,效率低下。普通二叉搜索树当数据接近有序时:1.2AVL树的规定① 每个节点的左右子树必须是二叉搜索树;②每个节点的左右子树的高度差(简称平衡因子)的绝对值不超过1;(即每个节点的左子树-右子树=0/1/-1);
2025-01-11 02:22:40
237
原创 std::set 的理解与使用
insert成员函数模版原形:insert单个数据插入:insert迭代器区间插入:(我们可以看到当插入相同数据的时候只会插入一个)
2025-01-06 13:36:03
281
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人