C++
文章平均质量分 90
c无序
这个作者很懒,什么都没留下…
展开
-
C++中的IO流
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?◉ 使用itoa()函数◉ 使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定, 而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。return 0;在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。原创 2024-08-14 17:44:54 · 1202 阅读 · 1 评论 -
C++中的类型转换
1️⃣ 内置类型转换自定义类型。原创 2024-08-14 17:38:14 · 1029 阅读 · 0 评论 -
C++中的特殊类设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打 仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。原创 2024-08-13 20:22:24 · 980 阅读 · 0 评论 -
C++中的智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.int _year;原创 2024-08-12 15:59:04 · 1226 阅读 · 3 评论 -
C++中的异常处理
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:, _id(id){}return _id;原创 2024-08-03 22:39:03 · 851 阅读 · 1 评论 -
C++11中的lambda 与 包装器
实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。n的名字,其中n是一个整数,这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。原创 2024-08-01 15:13:15 · 986 阅读 · 0 评论 -
C++11简介+新变化+可变参数列表
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,原创 2024-07-30 13:03:15 · 935 阅读 · 1 评论 -
C++11中的右值引用以及移动构造等
左值是一个表示数据的表达式(如变量名或解引用的指针),原创 2024-07-29 22:49:06 · 690 阅读 · 1 评论 -
set 与 map底层实现
迭代器的好处是可以方便遍历,是数据结构的底层实现与用户透明。begin()与end()STL明确规定,begin()与end()代表的是一段前闭后开的区间,而对红黑树进行中序遍历后,可以得到一个有序的序列,因此:begin()可以放在红黑树中最小节点(即最左侧节点)的位置,end()放在最大节点(最右侧节点)的下一个位置,关键是最大节点的下一个位置在哪块?能否给成nullptr呢?原创 2024-07-24 11:32:05 · 367 阅读 · 0 评论 -
红黑树(C++实现)
◉ 如果u节点存在,则其一定是黑色的,那么cur节点原来的颜色一定是黑色的,现在看到红色的原因是因为cur的子树在调整的过程中将cur节点的颜色由黑色改成红色。◉ 如果u节点不存在,则cur一定是新插入节点,因为如果cur不是新插入节点,则cur和p一定有一个节点的颜色是黑色,就不满足性质4:每条路径黑色节点个数相同。p为g的左孩子,cur为p的右孩子,则对p先进行左单旋,回到情况二 再对g进行右单旋。p为g的右孩子,cur为p的左孩子,则对p先进行右单旋,回到情况二 再对g进行左单旋。原创 2024-07-22 17:11:23 · 1157 阅读 · 0 评论 -
AVL树(C++实现)
int _bf;原创 2024-07-21 14:35:53 · 819 阅读 · 0 评论 -
C++中map和set
kw=set翻译:❍ set是按照一定次序存储元素的容器❍ 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。❍ 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。❍ set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。原创 2024-07-19 15:25:55 · 811 阅读 · 0 评论 -
C++中二叉树进阶
那能否进行改进,不论按照什么次序插入关键码,二叉搜索树的性能都能达到最优?对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。,通过英文可以快速找到与其对应的中文,英文单词与其对应的中文<word, chinese>就构成一种键值对;1️⃣ 从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。❍ 在二叉搜索树中检索该单词是否存在,存在则拼写正确,不存在则拼写错误。,统计成功后,给定单词就可快速找到其出现的次数,原创 2024-07-18 20:52:40 · 790 阅读 · 0 评论 -
C++中的多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。**在继承中构成多态的两个条件:**★ 虚函数重写★ 父类指针或者引用调用虚函数多态调用,看指向对象类型,指向谁调用谁的虚函数普通调用,看调用者的类型,调用调用者的函数在C++中,抽象类是一种特殊的类,它不能被实例化,其主要目的是为了继承。抽象类至少包含一个纯虚函数,纯虚函数是在声明中初始化为0的虚函数(即在虚函数后面写上 = 0)。原创 2024-07-10 12:58:42 · 884 阅读 · 0 评论 -
C++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。// 这里体现出了Student和Teacher复用了Person的成员。原创 2024-07-09 13:18:00 · 849 阅读 · 1 评论 -
C++模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性【缺陷】1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-06-07 14:48:38 · 749 阅读 · 0 评论 -
STL中stack和queue模拟实现+容器适配器
deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素,与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列底层是一段假象的连续的空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在看deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示;原创 2024-06-06 15:10:46 · 927 阅读 · 0 评论 -
priority_queue的模拟实现
目录priority_queue类定义priority_queue构造函数priority_queue类push()函数priority_queue类pop()函数priority_queue类size()函数priority_queue类empty()函数priority_queue类top()函数仿函数与priority_queue类模拟实现项目代码:实现priority_queue的方式和stack和queue基本类似,因为priority_queue也是一种容器适配器,但是只能使用vector和de原创 2024-06-06 15:07:18 · 492 阅读 · 0 评论 -
STL中queue的介绍和使用
1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4.标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。原创 2024-06-02 11:21:49 · 959 阅读 · 0 评论 -
STL中stack的使用
1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出3.stack的底层容器可以是任何标准的容器类模版或者一些其他特定的容器类,这些容器类应该支持一下操作:·empty:判空操作·back:获取尾部元素操作·push_back:尾部插入元素操作。原创 2024-06-01 11:17:15 · 487 阅读 · 0 评论 -
STL中list的模拟实现
代码是没有问题的,但是我们也可以发现,这样非常的冗余 有些函数是没有变化的,确多写了一遍,有没有什么办法能解决这种冗余呢?const迭代器的目标是 迭代器本身可以修改,指定的内容不能修改,类似const T* p。因此我们重新写一个const类进行封装,我们只需改变解引用即可,使得指向内容不能修改。浅拷贝生成的ls2,与ls1的地址相同,对ls1操作也会对ls2有影响。由于我们经常使用申请头节点,因此我们把头节点封装成一个函数,便于调用。这里存在迭代器失效,因此我们和库里一样返回下一个节点迭代器。原创 2024-05-30 14:48:05 · 780 阅读 · 0 评论 -
List基本使用(C++)
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移动元素的执行效率更好。原创 2024-05-27 20:27:39 · 849 阅读 · 0 评论 -
vector类实现
vector类的迭代器区间不局限于本类的迭代器,所以需要用到函数模版。C++内置类型也支持构造,C语言不行。例如初始化int可以这样写。原创 2024-05-22 21:14:47 · 360 阅读 · 0 评论 -
vector的介绍及使用
1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。原创 2024-05-19 10:32:52 · 685 阅读 · 0 评论 -
string类实现
因为C形式字符串是内置类型,所以使用cout打印时编译器会自动识别类型,相当于使用%s进行打印字符串,只需要返回字符串数组首字符地址即可。可以以数组的形式,通过下标访问数据。我们采用声明和定义分离的方式。原创 2024-05-15 20:03:07 · 485 阅读 · 0 评论 -
String2⃣️-string类对象的修改操作
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置。在str中从pos位置开始,截取n个字符,然后将其返回。operator+=:在字符串后追加字符串str。push back:在字符串后尾插字符c。append:在字符串后追加一个字符串。返回char格式字符串。原创 2024-04-30 14:51:35 · 310 阅读 · 0 评论 -
String类1⃣️
3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的 元素空间。4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserver不会改变容量大小。返回字符串有效字符长度。原创 2024-04-29 20:43:47 · 515 阅读 · 0 评论 -
C++模版初阶
class T类模板名// 类内成员定义// 类模版public:perror("malloc申请空间失败");return;_size = 0;// 模版不建议声明和定义分离到.h 和.cpp会出现链接错误,具体原因后面会讲// 要分离也分离在.h// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表// 扩容++_size;原创 2024-04-24 20:53:28 · 608 阅读 · 0 评论 -
C/C++内存管理
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序末能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最終卡死。原创 2024-04-23 14:30:14 · 1072 阅读 · 0 评论 -
拷贝对象时的一些编译器优化
在传值传参过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。优化结果由编译器决定,不同的编译器优化结果可能不同。在前面explicit关键字部分提到编译器会对在单行的构造+拷贝构造优化为构造。原创 2024-04-21 09:18:24 · 162 阅读 · 0 评论 -
类和对象下-初始化列表 explicit 关键字 static成员 友元等
的。原创 2024-04-20 15:37:55 · 810 阅读 · 1 评论 -
类和对象中3⃣️-默认成员函数(赋值运算符重载,取地址及 const取地址操作符重载等)
在上面代码中,虽然重载了原创 2024-04-19 11:33:55 · 665 阅读 · 0 评论 -
类和对象中2⃣️-默认成员函数(拷贝构造函数 运算符重载)
编译器会生成默认的拷贝构造函数,原创 2024-04-17 23:29:54 · 574 阅读 · 0 评论 -
类和对象中1⃣️-默认成员函数(构造函数 析构函数)
目录1.类的6个默认成员函数2.构造函数2.1 概念3.析构函数3.1 概念3.2 特性1.类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。class Date{};2.构造函数2.1 概念构造函数是特殊的成员函数,需注意的是,构造函数虽然名称叫构造,但是构造函原创 2024-04-11 13:00:45 · 996 阅读 · 1 评论 -
类和对象—上
/类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。一般情况下,更期望采用第二种方式。成员变量命名规则建议:其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行。原创 2024-04-07 20:58:22 · 789 阅读 · 0 评论 -
C向C++基础过度(三)
使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?(因为C语言不使用auto也可以达到自动销毁的状态)C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。int j = 0;// 右边初始化自动推导类型auto i = 0;// 等价的,auto可以替代写起来比较长的类型的定义,简化代码return 0;【注意】原创 2024-04-02 16:29:38 · 1263 阅读 · 1 评论 -
C向C++基础过度(二)
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体;原创 2024-04-02 14:28:09 · 947 阅读 · 1 评论 -
C向C++过渡基础(一)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。原创 2024-03-29 09:59:19 · 1000 阅读 · 2 评论