自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 C++ set,map

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的 内存是从空间配置器申请的。关联式容器也是用来储存数据结构的,与序列式容器不同的是,关联式容器逻辑结构是非线性结构,两个位置有紧密的关联关系,交换一下他的数据结构就被破坏了。• set底层是⽤红⿊树实现,增删查效率是 O(logN)的,迭代器遍历是⾛的搜索树的中序,所以是有序。2.1set的构造和迭代器。

2025-03-28 23:39:01 313

原创 C++二叉搜索树

2. ⼆叉搜索树的性能分析最优情况下,⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: log2 N 最差情况下,⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度为: N 所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为: O(N) 那么这样的效率显然是⽆法满⾜我们需求的,⼆叉搜索树的变形平衡⼆叉搜索树AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是不⽀持修改key,修改key破坏搜索树性质了,可以修改value。4. ⼆叉搜索树的查找。

2025-03-25 10:47:30 900

原创 C++多态

• 析构函数的重写 基类的析构函数为虚函数,此时派⽣类析构函数只要定义,⽆论是否加virtual关键字,都与基类的析 构函数构成重写,虽然基类与派⽣类析构函数名字不同看起来不符合重写的规则,实际上编译器对析 构函数的名称做了特殊处理,编译后析构函数的名称统⼀处理成destructor,所以基类的析构函数加了 vialtual修饰,派⽣类的析构函数就构成重写。第⼆派⽣类必须对基类的虚函数完成重写/覆盖,重写或者覆盖了,基类和派⽣类之间才能有不同的函数,多态的不同形态效果才能达到。3.多态是如何实现的。

2025-03-22 19:21:50 475

原创 C++继承

7. 多继承及其菱形继承问题 7.1 继承模型 单继承:⼀个派⽣类只有⼀个直接基类时称这个继承关系为单继承 多继承:⼀个派⽣类有两个或以上直接基类时称这个继承关系为多继承,多继承对象在内存中的模型 是,先继承的基类在前⾯,后⾯继承的基类在后⾯,派⽣类成员在放到最后⾯。4.2实现⼀个不能被继承的类 ⽅法1:基类的构造函数私有,派⽣类的构成必须调⽤基类的构造函数,但是基类的构成函数私有化以 后,派⽣类看不⻅就不能调⽤了,那么派⽣类就⽆法实例化出对象。(因为翻译的原因,所以 既叫基类/派⽣类,也叫⽗类/⼦类)

2025-03-19 21:42:32 719

原创 c++--模拟实现优先队列

向下调整这里使用的是假设孩子法来确定要交换孩子的下标,交换以后再将父亲和孩子下标更新,进行从上到下的调整,如果比较失效就跳出循环,建堆完成。Pop的实现先将头部数据和尾部数据进行交换,然后再尾删,再进行向下调整,而不是直接进行头删,这样会导致堆的结构被破坏。这里的迭代器构造在插入后就完成建堆,使用的是向下调整,向下调整的空间复杂度会比向上调整的要简单,减少消耗。这个类中会实现堆的push,pop,top,empty,size等接口。这里实现了push的操作,需要先将数据进行尾插,然后从尾进行向上调整。

2024-12-09 23:34:26 465

原创 c++--模拟实现队列

该底层容器应至少支持以下操 作: empty:检测队列是否为空 size:返回队列中有效元素的个数 front:返回队头元素的引用 back:返回队尾元素的引用 push_back:在队列尾部入队列 pop_front:在队列头部出队列。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。1. 与栈一样,队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。

2024-12-09 12:00:18 311

原创 c++--以容器适配器模拟栈实现

可以看出与一般模拟实现不同的是,并没有手搓各种操作,而是调用增加了一个类模板来调用这个类中的已经写好的成员函数接口来实现栈的后进先出,所以表明栈只是一种模式,其中可以使用其他各种类来实现栈的后进先出模式。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。

2024-12-09 11:27:20 158

原创 c++--堆的模拟实现

【代码】c++--堆的模拟实现。

2024-12-08 21:11:34 230

原创 C++-list模拟实现

【代码】C++-list模拟实现。

2024-12-04 12:31:56 162

原创 c++--vector模拟实现

本文旨在完成vector的增删查改的内容。

2024-11-27 18:07:54 152

原创 c++--vector用法

因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器, 程序可能会崩溃)。3.erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是没有元素的,那么pos就失效了。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。

2024-11-22 20:46:27 786

原创 c++--string类的模拟实现

【代码】c++--string类的模拟实现。

2024-11-21 22:53:56 133

原创 C++--string类(1)

增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。的库函数,但是这些库函数与字符串是分离开的,不太符合。操作时,如果能够大概预估到放多少字符,可以先通过。操作不仅可以连接单个字符,还可以连接字符串。,自动迭代,自动取数据,自动判断结束。中有效字符清空,不改变底层空间大小。结尾的一些字符的集合,为了操作方便,预留空间,不改变有效元素个数,当。

2024-11-01 12:03:31 677

原创 C++模板

重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增。如何实现一个通用的加法函数?我们可以类似这样使用函数重载的方法进行编写。代码的可维护性比较低,一个出错可能所有的重载均出错。运行结果很明显这个模板是能够完成这种泛型编程的操作。这是因为模板中只有一个T无法变成两种类型,类模板实例化与函数模板实例化不同,还有另外一种方法就是。

2024-10-24 23:57:00 474

原创 C++中的内存管理

由图不难得知,局部变量是储存在栈中的,而malloc,calloc,realloc开辟出来的空间是储存在堆中的,全局数据和静态变量储存在数据段中,也叫静态区.代码段存的是可执行代码和只读常量。自定义类型中使用new和delete会自动申请类型大小的空间和自动调用构造函数和相应的析构函数并释放空间。申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施。失败,尝试执行空 间不足应对措施,如果改应对措施用户设置了,则继续申请,否。在申请的空间上执行构造函数,完成对象的构造。

2024-10-24 20:08:50 1181

原创 C++类和对象(下)补充

当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷⻉会进⾏合并优化,有些更新更"激进"的编译器还会进⾏跨⾏跨表达式的合并优化。现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷⻉。⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的 叫有名对象。匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名象。对象拷⻉时的编译器优化。

2024-10-22 22:41:38 126

原创 C++类和对象(下)

尽量使⽤初始化列表初始化,因为那些你不在初始化列表初始化的成员也会⾛初始化列表,如果这 个成员在声明位置给了缺省值,初始化列表会⽤这个缺省值初始化。如果你没有给缺省值,对于没有显⽰在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的 成员使⽤的。每个成员变量在初始化列表中只能出现⼀次,语法理解上初始化列表可以认为是每个成员变量定义 初始化的地⽅。,因为缺省值是个构造函数初始化列表的,

2024-10-22 00:54:59 904

原创 C++--类和对象中(补充)

7.重载<<和>>时,需要重载为全局函数,因为重载为成员函数,this指针默认抢占了第⼀个形参位 置,第⼀个形参位置是左侧运算对象,调⽤时就变成了 对象<<cout,不符合使⽤习惯和可读性。3.重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。⼀元运算符有⼀个参数,⼆元运算符有两个参数,⼆元运算符的左侧运算对象传给第⼀个参数,右侧运算对象传给第⼆个参数。4.如果⼀个重载运算符函数是成员函数,则它的第⼀个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数⽐运算对象少⼀个。

2024-10-21 03:30:00 334

原创 C++入门--类和对象(中)

类的默认成员函数

2024-09-13 23:30:35 1263

原创 C++--类和对象(上)补充

C++和C语⾔实现Stack

2024-09-13 18:11:09 251

原创 C++入门--类和对象(上)

C++入门--类和对象(上)

2024-09-12 13:11:09 756

原创 C++入门--内联函数,nullptr

C++入门--内联函数,nullptr

2024-09-12 11:01:43 324

原创 C++入门——缺省参数,引用,函数重载

C++入门——缺省参数,引用,函数重载的一些用法

2024-09-10 22:35:26 881

原创 C++入门--输⼊&输出

C++入门--输⼊&输出

2024-09-10 21:44:27 174

原创 c++入门——命名空间

C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。• C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。

2024-09-08 22:04:32 393 1

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除