![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 68
cherub.
这个作者很懒,什么都没留下…
展开
-
优先级队列
不是传统的队列,先进先出,而是让优先级高的先出其中less是大堆,greater是小堆简单的使用一下:输出:默认是一个大堆 ,大的优先级高但是我想小的优先级高。原创 2024-05-10 10:18:41 · 423 阅读 · 0 评论 -
stack的使用
我们可以看到模板参数里面有一个容器适配器 ,什么是适配器?比如充电器就叫做电源适配器,用在做转换,对电压进行相关的转换适配我们的设备。栈,队列不是自己直接管理数据,是让其他容器管理数据,在其他容器上去封装转换我想要的东西。和容器 vector,list相比,他们是直接自己管理数据,但是栈不是。原创 2024-05-08 22:19:48 · 705 阅读 · 0 评论 -
list的模拟实现
const对象只能使用const类型的迭代器,const是只读的,模拟const T*,是指向的内容不可改变,而不是本身不可改变。const_iterator是一个全新的类型,不是const iterator。但是const迭代器和普通迭代器主要区别就是返回值不一样,所以上面的写法太冗余了。使用模板,交给编译器去做。list迭代器不是原生的指针,将节点的指针进行封装,来模拟指针的行为。需要实现重载-> 返回的是A对象的指针,在用->访问其中的成员。如果list存的是自定义类型,怎么访问其中的数据呢?原创 2024-05-07 22:09:24 · 1064 阅读 · 0 评论 -
vector的oj题
给你一个整数数组nums,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。原创 2024-05-06 16:44:53 · 407 阅读 · 0 评论 -
vector的模拟实现
迭代器失效:如果失效就不能在使用这个迭代器,如果使用了,结果是未定义的。vs2019进行强制检查,erase以后认为it失效了,不能访问,访问就报错。pos还指向之前旧的空间,扩容后pos失效了,需要更新pos。结论:insert和erase以后迭代器都失效,不能再访问。一般情况下不会失效,但是下面这种情况会失效。是因为扩容中memcpy导致的问题。返回的是删除数据的下一个位置。原创 2024-05-04 11:13:19 · 560 阅读 · 0 评论 -
vector的使用
其中最最重要的是resize和reserve,max_size是没有意义的接口,告诉能开多大空间,但是实际上不准,所以平时不需要管。易错点:reserve空间开出来就可以访问吗?front和back支持访问头尾的数据,但是一搬习惯于[]先看一下vector的扩容机制。要是想访问,只能用下面的方法。输出:大概是1.5扩容。原创 2024-05-03 10:00:21 · 425 阅读 · 1 评论 -
string的模拟实现(下)
传统写法:自力更生现代写法。原创 2024-04-30 10:25:50 · 218 阅读 · 0 评论 -
string的模拟实现(上)
string的模拟实现(上)原创 2024-04-28 21:35:14 · 563 阅读 · 2 评论 -
string的OJ题
给定两个字符串形式的非负整数num1和num2,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如BigInteger), 也不能直接将输入的字符串转换为整数形式。思路:从字符串的末尾开始逐位相加,并处理进位。字符转换为数字 -‘0’ 数字转换为字符+'0'// 输出:3。原创 2024-04-26 20:28:37 · 207 阅读 · 1 评论 -
string
g++(2倍扩容)和vs编译器(1.5倍扩容)是不一样的,但频繁的扩容会产生代价!原创 2024-04-25 22:02:51 · 477 阅读 · 1 评论 -
String
范围for,会取s1中的字符赋值给ch,自动判断结束,自动++,原理:编译器替换成迭代器。*it赋值给ch,ch是*it的拷贝,所以不支持修改。但是取别名可以修改,并且范围for不支持倒着遍历。迭代器(遍历数据结构的一种方式),可以想象成一个指针,string就和顺序表一样。2.length,不具有通用性,所以就用size。1.size不算\0,\0是用来标识结束的。3.clear清理数据,不释放空间。const迭代器,只能读,不能写。4.max_size不用管,无用。应用:其中1,2,4用的多。原创 2024-04-25 15:23:41 · 228 阅读 · 1 评论 -
模板初阶(泛型编程、函数模板、类模板)
如何实现一个通用的交换函数呢?使用函数重载虽然可以实现,但是有几个不好的地方:内部的逻辑都是一样的,只是类型不一样。所以就引出模板template。原创 2024-04-24 10:53:32 · 959 阅读 · 0 评论 -
C++内存分布
以下变量在哪个区?A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)abcd\0在常量区,再把常量区的abcd\0复制给char2,char2 数组在栈上,数组名就是首元素的地址,所以char2在栈上,pChar3是指针,存的是常量区中abcd\0的地址,所以解引用就是指向常量区。ptr1在栈上面,开的空间在堆上面。原创 2024-04-24 10:06:04 · 469 阅读 · 0 评论 -
C/C++内存管理
int main()//malloc没有办法很好支持动态申请的自定义对象初始化//不会调用构造函数,不初始化//报错,万一有很多个成员,要写很多个get函数//自定义类型,开空间+调用构造函数初始化//自定义类型,调用析构函数+释放空间delete p2;delete p3;A aa1(1);A aa2(2);return 0;应用。原创 2024-04-23 21:56:02 · 1386 阅读 · 0 评论 -
static、友元与内部类
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量,用static修饰的成员函数,称之为静态成员函数,静态成员变量一定要在类外进行初始化。面试题:实现一个类,计算程序中创建出了多少个类对象但是这种写法存在缺陷,C++讲究封装,因为C语言随便修改结构中的内容不好,直接越过我访问数据,就会出现很多问题。要是其他人在main函数中--n,--m,结果就完全变了。原创 2024-04-22 15:27:21 · 393 阅读 · 0 评论 -
初始化列表和explicit关键字
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。class Datepublic://初始化列表是每个成员定义的地方,_day(day){}private: //每个成员的声明,声明不开空间,对象实例化的时候开空间int _year;//这三个成员什么时候定义,对象实例化的时候整体定义int _month;int _day;混着用_day = day;原创 2024-04-21 22:10:45 · 729 阅读 · 1 评论 -
赋值运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。函数原型:返回值类型 operator操作符(参数列表)比如日期比较大小:不能直接用运算符比较!可以先写一个DateLess函数来比较但是我就是想写d1原创 2024-04-18 16:56:04 · 391 阅读 · 1 评论 -
构造函数和析构函数详解
4.无参的构造函数和全缺省的构造函数都被称为默认构造函数,并且默认构造函数有且只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的(对象在栈帧中,栈帧结束就跟着销毁)。总结:一般情况下,我们都需要自己写构造函数,决定初始化方式,成员变量全是自定义类型,可以考虑不写构造函数。3.自定义类型(struct,class,union,..) 会处理,会去调用这个成员的默认构造函数。原创 2024-04-16 10:02:11 · 479 阅读 · 0 评论 -
类的实例化和this指针
类是存在于文件系统中,在内存中不占空间,类的本质就是设计图纸,图纸不能住人,建成房子才能住人,所以,类中不能存数据,必须实例化为对象才可以存数据。原创 2024-04-15 17:17:22 · 1080 阅读 · 1 评论 -
类与对象(一)
/类体:由成员函数和成员变量组成//一定要注意后面的分号.c文件public://成员函数int Top();private://成员变量int* a;int top;.cpp文件void Stack::Init()//告诉编译器Init是Stack的成员函数//函数中我知道top指向的是哪个位置main函数int main()Stack st;st.Init();st.push(1);st.push(1);原创 2024-04-15 15:05:43 · 300 阅读 · 1 评论