![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 86
c无序
这个作者很懒,什么都没留下…
展开
-
C++模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性【缺陷】1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-06-07 14:48:38 · 722 阅读 · 0 评论 -
STL中stack和queue模拟实现+容器适配器
deque(双端队列):是一种双开口的“连续”空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素,与list比较,空间利用率比较高。deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组双端队列底层是一段假象的连续的空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在看deque的迭代器身上,因此deque的迭代器设计就比较复杂,如下图所示;原创 2024-06-06 15:10:46 · 862 阅读 · 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 · 454 阅读 · 0 评论 -
STL中queue的介绍和使用
1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列。3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4.标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。原创 2024-06-02 11:21:49 · 933 阅读 · 0 评论 -
STL中stack的使用
1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出3.stack的底层容器可以是任何标准的容器类模版或者一些其他特定的容器类,这些容器类应该支持一下操作:·empty:判空操作·back:获取尾部元素操作·push_back:尾部插入元素操作。原创 2024-06-01 11:17:15 · 364 阅读 · 0 评论 -
STL中list的模拟实现
代码是没有问题的,但是我们也可以发现,这样非常的冗余 有些函数是没有变化的,确多写了一遍,有没有什么办法能解决这种冗余呢?const迭代器的目标是 迭代器本身可以修改,指定的内容不能修改,类似const T* p。因此我们重新写一个const类进行封装,我们只需改变解引用即可,使得指向内容不能修改。浅拷贝生成的ls2,与ls1的地址相同,对ls1操作也会对ls2有影响。由于我们经常使用申请头节点,因此我们把头节点封装成一个函数,便于调用。这里存在迭代器失效,因此我们和库里一样返回下一个节点迭代器。原创 2024-05-30 14:48:05 · 749 阅读 · 0 评论 -
List基本使用(C++)
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3.list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4.与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移动元素的执行效率更好。原创 2024-05-27 20:27:39 · 792 阅读 · 0 评论 -
vector类实现
vector类的迭代器区间不局限于本类的迭代器,所以需要用到函数模版。C++内置类型也支持构造,C语言不行。例如初始化int可以这样写。原创 2024-05-22 21:14:47 · 327 阅读 · 0 评论 -
vector的介绍及使用
1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。3.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。原创 2024-05-19 10:32:52 · 635 阅读 · 0 评论 -
string类实现
因为C形式字符串是内置类型,所以使用cout打印时编译器会自动识别类型,相当于使用%s进行打印字符串,只需要返回字符串数组首字符地址即可。可以以数组的形式,通过下标访问数据。我们采用声明和定义分离的方式。原创 2024-05-15 20:03:07 · 445 阅读 · 0 评论 -
String2⃣️-string类对象的修改操作
从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置。在str中从pos位置开始,截取n个字符,然后将其返回。operator+=:在字符串后追加字符串str。push back:在字符串后尾插字符c。append:在字符串后追加一个字符串。返回char格式字符串。原创 2024-04-30 14:51:35 · 248 阅读 · 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 · 477 阅读 · 0 评论 -
C++模版初阶
class T类模板名// 类内成员定义// 类模版public:perror("malloc申请空间失败");return;_size = 0;// 模版不建议声明和定义分离到.h 和.cpp会出现链接错误,具体原因后面会讲// 要分离也分离在.h// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表// 扩容++_size;原创 2024-04-24 20:53:28 · 586 阅读 · 0 评论 -
C/C++内存管理
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序末能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最終卡死。原创 2024-04-23 14:30:14 · 1003 阅读 · 0 评论 -
拷贝对象时的一些编译器优化
在传值传参过程中,一般编译器会做一些优化,减少对象的拷贝,这个在一些场景下还是非常有用的。优化结果由编译器决定,不同的编译器优化结果可能不同。在前面explicit关键字部分提到编译器会对在单行的构造+拷贝构造优化为构造。原创 2024-04-21 09:18:24 · 132 阅读 · 0 评论 -
类和对象下-初始化列表 explicit 关键字 static成员 友元等
的。原创 2024-04-20 15:37:55 · 728 阅读 · 1 评论 -
类和对象中3⃣️-默认成员函数(赋值运算符重载,取地址及 const取地址操作符重载等)
在上面代码中,虽然重载了原创 2024-04-19 11:33:55 · 637 阅读 · 0 评论 -
类和对象中2⃣️-默认成员函数(拷贝构造函数 运算符重载)
编译器会生成默认的拷贝构造函数,原创 2024-04-17 23:29:54 · 552 阅读 · 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 · 951 阅读 · 1 评论 -
类和对象—上
/类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{ }中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。一般情况下,更期望采用第二种方式。成员变量命名规则建议:其他方式也可以的,主要看公司要求。一般都是加个前缀或者后缀标识区分就行。原创 2024-04-07 20:58:22 · 762 阅读 · 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 · 1131 阅读 · 1 评论 -
C向C++基础过度(二)
以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体;原创 2024-04-02 14:28:09 · 914 阅读 · 1 评论 -
C向C++过渡基础(一)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。原创 2024-03-29 09:59:19 · 971 阅读 · 2 评论