c++初阶
文章平均质量分 80
虚舟游梦
在校大学生,在进行c/c++的学习。
展开
-
反向迭代器
原因在于Reverse_iterator的模板参数iterator也是模板,如果编译器允许去iterator中去找,找到的其实就是iterator中的T&和T*,但是iterator实例化后,T得到具体类型(假设是int),但是Reverse_iterator中的T并没有被实例化(对反向迭代器的适配支持中只传了iterator),还是虚拟的T类型。找到了也是虚拟类型。最开始*rit实际访问到的是6,++后指向6,实际访问到的是5,以此类推,当指向1时,访问完毕,rit和rend()相等。原创 2023-06-15 20:50:53 · 447 阅读 · 0 评论 -
deque(简单介绍一下)
如果将deque的数据拷贝进vector,进行排序,排序完再将数据拷贝给deque(用assign拷贝回deque),和直接对vector中的数据排序所花费的时间,进行比较,deque花费的时间大概是vector的1.4倍左右。1.中部插入删除效率不行,(要么需要挪动数据,要么支持每个开辟的空间大小不一定相同,这样的话,中控数组还要记录每个空间有多少个元素,因为要支持随机访问)对比两者的优缺点,发现他们的缺点正是为了他们的优点诞生的,两者不可分割。deque就是针对两者的缺点设计出来的,所以性能被牺牲了。原创 2023-06-06 18:05:16 · 455 阅读 · 0 评论 -
priority_queue的模拟实现和仿函数
这是一个函数,*和()相比,()优先级更高,函数名与()结合,为函数。sort的传参和优先级队列仿函数传参不同的是多了一个(),原因在于优先级队列传的是模板参数,这里传的是对象,优先级队列是在内部创建对象,sort是将创建好的对象传入sort使用。1.对函数指针解引用,找到对应函数,调用参数,和直接使用函数指针调用参数是一样的,即(*函数指针)(函数参数1.函数参数2)与函数指针(函数参数1,函数参数2)等价,代表函数指针可以直接使用()操作符,这样就能通过函数指针指向对应的比较函数,完成比较。原创 2023-06-06 18:04:42 · 388 阅读 · 0 评论 -
stack&queue的模拟实现
stack的代码少,原因在于采用了适配器模式,所谓适配器,以电器为例,每个电器都有电源适配器,中国的家用电源为220V的交流电,但是几乎没有电器需要220V的交流电,所以每个电器都有一个电源适配器,将家庭电压转换为自己需要的电压。简单的来说,deque是一个双端队列,虽然是队列,但并不是先进先出,而且deque支持随机访问,头插,头删,尾插,尾删,就机制而言,集合了list和vector的优点,但不代表能代替list和vector,因为在效率方面不如list和vector。这些也是queue的全部代码。原创 2023-05-29 21:17:20 · 505 阅读 · 0 评论 -
stack&queue
以1 + 2 * 3 / 4 - 5为例(最好通过画图辅助理解):遍历到1,存入后缀表达式,遍历到+,栈内为空,入栈,遍历到2,存入后缀表达式,遍历到*,和栈顶的+比较,入栈,遍历到3存入后缀表达式,遍历到/,和栈顶的*比较,*出栈,存入后缀表达式,/入栈,遍历到4存入后缀表达式,遍历到-,和栈顶的/比较,/出栈,存入后缀表达式,再和栈顶的+比较,+出栈,存入后缀表达式,此时栈内为空。-入栈,遍历到5,存入后缀表达式,遍历结束,栈内元素全部出栈。遍历结束,将栈内的运算符全部出栈,存入到后缀表达式中。原创 2023-05-29 21:18:14 · 510 阅读 · 0 评论 -
list的模拟实现
/it调用operator->()返回&(_node->date),即AA*,it->a1即AA* a1,实际上编译器为了可读性对这里进行简化。//这里的it是迭代器,解引用后拿到的是_date,_date的类型是T,即AA。//关于为什么const迭代器中T的前面不用加const:加上const,迭代器中的T就表示const T,_list_node就表示。//it调用operator*(),*it会拿到其中的数据,即拿到_next->date,为operator*()的返回值;原创 2023-05-26 10:20:33 · 884 阅读 · 0 评论 -
list的基本介绍
以及vector插入数据会扩容,影响运行效率(vector不断扩容销毁算比较大的),list每一份空间都是按需申请,释放,不会因为扩容影响运行效率。也可以说list的迭代器是双向迭代器,而算法中sort的迭代器需要随机迭代器。InputIterator:代表只写迭代器,可以传单向,双向,随机迭代器中的任意一种,这三种都支持写。还有一个splice函数,这是一个接合函数,将一个链表中的数据转移,插入到另一个链表中去。如果有大量数据需要排序的情况,不推荐使用list,因为list的sort效率不高。原创 2023-05-26 10:20:03 · 1029 阅读 · 0 评论 -
vector的介绍
就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问它们的元素,并且与在数组中一样有效。这次的构造函数和string相比有一点不同,出现了很多没见过的类型表示方法,这些类型是由已知的类型typedef出来的,可以从Member functions上面的表格中找到对应的类型。vector和string也是存在区别的,比如一些函数接口的不同,如:vector是没有append函数的,也没有+=重载,所以储存字符串数据用string比较好。原创 2023-05-22 23:02:54 · 1006 阅读 · 0 评论 -
vector模拟
/void reserve(size_t n)(push_back满时调用)-> memcpy(tmp, _start, size() * sizeof(T));//段错误的成因:数据:1,2,3,4 第一次找到2,删除,数据变成1,3,4 it指向3,++后指向4,4为偶数,删除,数据变成1,3。//另一种是迭代器指向的意义发生变化,比如1,2,3,4,5,迭代器指向2,在2之前插入20,变成1,20,3,4,5,此时。//缩容方案在:size() < capacity()/2 时可以考虑。原创 2023-05-22 23:08:31 · 374 阅读 · 0 评论 -
string的模拟实现
这样写的好处是,如果要存储小数组,就可以直接放到_buf[16]中去,就不用去对上申请了,如果字符串长度超过15,就放到_ptr指向的空间中去。// //有了get函数,就可以从缓冲区里识别空格符和换行符,比如输入hello world,hello被存入了string s中。// //就会出现要输入字符的字符串自动为空的情况,如果换一种空格不停止的停止条件,空格就是可以显示的。= &s)//如果不考虑if中的情况,在自己给自己赋值的情况下,就会丢失数据。原创 2023-05-07 19:30:48 · 418 阅读 · 0 评论 -
string的介绍
因为string是char实例化出来的,能很好的对应英文,但是gbk中的字符,也就是汉字,需要两个字节,一个字符不在对应一个char,所以设计出新的的类型char16_t(对应utf16),wchar_t(对应gbk),模板是为了应用到不同的场景(即存在不同的编码)中,比如在char16_t中一个字符就不是一个字节了。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及。因为s1,s2分别指向一个空间,所以第一个swap的交换,改变的是指向空间的方向,第二个swap的交换是深拷贝交换。原创 2023-05-06 20:23:49 · 530 阅读 · 0 评论 -
c++STL库
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神(开放源代码,Linux,git,mysql也是开源的)(与之相对的是闭源,iOS,Windows就是闭源,装Windows的费用被计算在了电脑的价格中),他们声明允许任何人任意。由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,被微软的VS系列使用了,负责这个版本的维护和更新的就是微软工程师。算法:对数据处理的方式。原创 2022-11-18 14:53:30 · 1042 阅读 · 0 评论 -
模板-进阶(没有什么内容,只是一个知识点)
在编译过程中template.s内容为空,因为根本不知道T是什么类型(在链接步骤之前,各个文件都是独立的),没法生成对应类型的函数;针对这个现象,一些使用模板的文件会把文件后缀名改为.hpp,意为.h和.cpp的结合,通常只表示模板。文件后缀名不改,还是.h效果是一样的,因为.h和.hpp文件都会被展开,只是.hpp更具有标识性。汇编(生成符号表):Test.o和template.o(或者:Test.obj和template.obj)//格式固定,这是对vector整体实例化,也可以对某个函数实例化。原创 2022-09-21 09:25:31 · 140 阅读 · 0 评论 -
模板-初阶
template//模板参数的缺省和一般函数一样,要从右往左缺省,因为函数实参是从左往右赋值的。//函数模板可以根据实参推演参数类型,类模板没办法推演,所以要指定存储类型。非要这么写的话,要指定T的具体类型:Add(a1,d1);//如果st1存储int类型的数据,st2存储double类型的数据要怎么改?或者主动转换(强转):Add(a1,(int)d1);根据实参类型决定形参类型的过程叫编译器的推演,推演后生成函数的过程叫模板的实例化。原创 2022-09-21 09:21:32 · 315 阅读 · 0 评论 -
动态内存管理
如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。//new带[]出来的,delete也要加上[]。.原创 2022-08-12 20:50:02 · 335 阅读 · 0 评论 -
类和对象(3)
具体如何重载需要引入一个概念。已知:内置类型可以直接使用运算符,cout会自动识别内置类型。cout如何自动识别类型的?cout和cin具体又是什么?原创 2022-07-25 09:57:56 · 427 阅读 · 0 评论 -
日期类的实现
/下面这个是后置++,暂时不会写,后置++此时不能有缺省值,如果加上那么调用++重载函数,前置++后置++都是不需要参数的,使用++时编译器就会不知道调用哪一个了。特别声明这里的改进并不是自上而下的改进,而是边写边改进,所以整体的结构并不是很合理。声明和定义不能分离的是内联函数,类中函数的声明和定义可以分离,只是需要一定格式。//在获取月份天数哪里将0月的位置改为12月的天数,解决0月的问题。//在获取月份天数哪里将0月的位置改为12月的天数,解决0月的问题。//计算日期之间间隔的天数,暂时不会写。....原创 2022-07-24 11:26:17 · 177 阅读 · 2 评论 -
类和对象(2)(6个默认成员函数)
1.类的6个默认成员函数(友情提示:这部分相当恶心)如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。2.构造函数C语言语法存在很多问题,比如忘记初始化(很普遍),在一些情况下会造成程序的崩溃。c++是针对C语言的改造升级,所以c++有构造函数来解决忘记初始化的问题。也就是说,之前日期类中Init函数其实没必要存在。构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适原创 2022-07-23 19:05:03 · 301 阅读 · 0 评论 -
类和对象(1)
指针是对内存编号的结果,从0x00000000到0xFFFFFFFF,从小往大编,空指针就是第一个字节空间的地址,第一个字节空间通常会被预留出来,不存储数据,所以空指针是不可访问的。4.如果出现结构体嵌套结构体的情况,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小就是所有对齐数中(包括嵌套结构体的对齐数)最大对齐数的整数倍。具体取决于栈的初始化。栈里面有三个成员,三个函数,按理解,函数应该会存函数指针,函数调用时,还要建立栈帧,函数在类的类域中,所以计算类的大小可能还要考虑函数栈帧的大小。..原创 2022-07-22 19:14:44 · 282 阅读 · 0 评论