C/C++
文章平均质量分 96
C/C++学习之路,坚持就是胜利!!!
路飞雪吖~
一分耕耘一分收获,保持热爱(^v^)
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
智能指针(内存泄漏问题)
借此,我们实际上把管理一份资源的责任托管给了一个对象。这种方法有两大好处:• 不需要显式的释放资源;• 采用这种方式,对象所需的资源在其生命期内始终保持有效。原创 2024-11-01 22:00:00 · 1147 阅读 · 0 评论 -
unordered_map 和 unordered_set 的模拟实现
🌻本篇文章,重点是:和模拟实现是如何进行封装的,封装的细节需要注意哪些,注意看仔细哦~原创 2024-10-25 21:26:57 · 983 阅读 · 0 评论 -
哈希表【闭散列/开散列】
1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。4. unordered_map容器通过key访问单个元素要比map快,原创 2024-10-24 21:55:00 · 1069 阅读 · 0 评论 -
C++11特性
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用列表初始化时,可添加等号(=),也可不添加:创建对象也可以使用列表初始化方式调用构造函数初始化原创 2024-10-26 22:00:00 · 691 阅读 · 0 评论 -
红黑树的实现
为了后续实现关联式容器简单,红黑树的实现中增加一个头结点,因为根节点必须为黑色,为了 与根节点进行区分,将头结点给成黑色,并且让头结点的 pParent 域指向红黑树的根节点,pLeft 域指向红黑树中最小的节点,_pRight域指向红黑树中最大的节点。,红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以红黑树在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用红黑树更多。注:此处看到的树,有可能是一颗完整的树,也可能是一颗子树。原创 2024-10-07 20:19:06 · 810 阅读 · 0 评论 -
AVL树的实现
从上面的左单旋、右单旋,我们可以知道,插入的节点都是偏向同一边的(left->left、right->right),如果我们插入的节点不在同一侧呢?这里的平衡因子,并不是实现AVL树的,唯一方式,有一些会直接去看高度差来进行控制,但是我们这里采用的是平衡因子。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• 进行旋转完后,最重要的是维护好平衡因子,情况一和情况二的区别就是旋转后平衡因子的变化不一样。• parent所在的子树高度都会变化,需要继续往上更新;原创 2024-10-06 22:30:00 · 982 阅读 · 0 评论 -
【C++】树形结构的关联式容器:set、map、multiset、multimap的使用
set的介绍1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。原创 2024-10-02 22:00:00 · 1356 阅读 · 0 评论 -
【C++】继承
🌟继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前我们接触的复用都是函数复用,继承是类设计层次的复用。//学号protected:int _jobid;//工号Student s;Teacher t;s.Print();原创 2024-09-06 22:30:00 · 1022 阅读 · 0 评论 -
【C++】多态and多态原理
🌟多态的构成条件多态是在不同关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。在继承中构成多态的两个条件(指向谁调用谁)1、必须通过基类的指针或者引用调用虚函数;2、被调用的函数必须是虚函数(对象都不行),且派生类必须对基类的虚函数进行重写;🌟虚函数即 被virtual修饰的类成员函数称为虚函数。class Apublic:🌟虚函数的重写。原创 2024-09-15 22:30:00 · 1165 阅读 · 0 评论 -
二叉搜索树的实现 K模型 和 KV模型
• 对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。搜索二叉树的节点不仅要存该节点的值,还要存左右节点的指针,因此把节点封装成一个节点类,以便对节点插入、删除、查找等进行操作。KV模型:每一个关键码key,都有与之对应的值value,即的键值对。• 找到位置,创建节点,并判断节点是插入在前一个节点的左边还是右边。• 在插入时,树为空,新建的节点要存value;原创 2024-09-28 21:56:41 · 899 阅读 · 0 评论 -
【C++】模板特化
2. 模板定义的位置显式实例化。四、模板总结。原创 2024-09-04 22:30:00 · 2706 阅读 · 0 评论 -
【C++】stack、queue、priority_queue的模拟实现
2、队长被实现为容器适配器,这些类使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函数来访问其元素。2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue。3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。底层是一个堆,在堆后中插入数据,数据就乱了,因此要向上调整堆的数据。原创 2024-09-02 17:20:36 · 1208 阅读 · 0 评论 -
【C++】list的使用和list的模拟实现和迭代器失效问题
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2024-08-28 22:00:00 · 1020 阅读 · 0 评论 -
【C++】vector的模拟实现
• erase删除pos位置元素后,pos位置之后的元素会往前搬移,没有导致底层空间的改变,理论上讲迭代 器不应该会失效,但是:如果pos刚好是最后一个元素,删完之后pos刚好是end的位置,而end位置是 没有元素的,那么pos就失效了。• 出错原因:以上操作,都有可能会导致vector扩容,也就是说vector底层原理旧空间被释放掉,而在打印时,it还使用的是释放之间的旧空间,在对it迭代器操作时,实际操作的是一块已经被释放的空间,而引起代码运行时崩溃。原创 2024-07-29 15:40:05 · 1077 阅读 · 0 评论 -
【C++】vector的使用
Vector是表示大小可以改变的数组的序列容器。与数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的效率一样高。但与数组不同,它们的大小可以动态变化,其存储由容器自动处理。在内部,vector使用动态分配的数组来存储它们的元素。当插入新元素时,可能需要重新分配此数组以增加大小,这意味着分配一个新数组并将所有元素移动到其中。就处理时间而言,这是一项相对昂贵的任务,因此,vector不会在每次将元素添加到容器时重新分配。原创 2024-07-28 13:38:22 · 1334 阅读 · 0 评论 -
【C++】 string类的模拟实现
这里我们给字符数组分配一个空间大小来储存\0,同时设置类的_size和_capacity成员变量的初始值。一些细节:以上涉及到相关的接口实现往接着下看😊用常量字符串:_str(new char[strlen(str) + 1])//+1给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数组中我们可以对代码进行优化,可以将上述两个函数通过缺省值合并为一个函数。// +1是给末尾存储\0//用字符串函数将常量字符串拷贝到对象的数值中。原创 2024-07-20 13:31:51 · 1011 阅读 · 0 评论 -
【C++】 string类的常用接口类型的使用
在使用string类时,必须包含#include头文件以及using namespace std;string 是表示字符串的字符串类;该类的接口与常规容器的接口基本相同,再添加一些专门用来操作string的常规操作;string在底层实际是:basic_string模板类的别名,不能操作多字节或者变长字符的序列。原创 2024-07-15 12:55:13 · 1159 阅读 · 0 评论 -
【C++】类与对象(中)赋值运算符重载、const成员、取地址操作符重载
返回对象是一个局部对象或者临时对象,出了当前func()函数作用域,就析构销毁了,那么不能引用返回,用引用返回是存在风险的,因为引用对象在func()函数栈帧已经销毁了,这两运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如。运算符有显式调用和直接调用,当写成显式调用时,就牺牲了代码的可读性,此时与函数的调用类似。虽然返回引用可以减少一次拷贝,但是出了函数作用域,返回对象还在,才能引用返回。,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明。原创 2024-05-08 21:38:36 · 892 阅读 · 4 评论 -
【C++】类和对象(下)构造函数、static成员、友元、内部类、匿名类)
3。原创 2024-05-13 21:55:21 · 2111 阅读 · 8 评论 -
【C++】初识模板 (函数模板和类模板)
class 类模板名//类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)原创 2024-05-28 21:39:26 · 633 阅读 · 0 评论 -
【C/C++】内存管理
int main()自定义类型,new才会调用构造初始化,malloc不再适用开空间/释放空间,还会调用构造和析构delete p2;delete p3;return 0;在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc 和 free不会。原创 2024-05-17 21:50:41 · 1861 阅读 · 1 评论 -
【C++】类与对象(中)(构造函数、析构函数、拷贝构造函数)
则C++编译器。原创 2024-05-01 14:13:42 · 1836 阅读 · 0 评论 -
【C++】类与对象(上)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号类的两种定义方式:1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。public:public://成员变量声明char* _sex;int _age;成员函数名前需要加类名::一般情况下,声明和定义要分离,方便操作。小贴士:成员变量命名规则:_ 、m :区分成员变量和外面的普通变量,一般都是加个前缀或者后缀标识符区分,具体看个人习惯。原创 2024-04-22 20:18:48 · 783 阅读 · 0 评论 -
【C++】入门(下)
在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,这是为什么呢?auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。return 10;auto b = a;//typeid():查看数据类型//auto e;无法通过编译,使用auto定义变量时必须对其进行初始化return 0;原创 2024-04-20 00:50:15 · 699 阅读 · 0 评论 -
【C++】入门(中)
int a = 1;int& ra;//编译出错。原创 2024-04-16 21:24:13 · 479 阅读 · 0 评论 -
【C++】 入门 (上)
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数、类型。//命名空间定义//命名空间中可以定义变量、函数、类型struct xlfint val;原创 2024-03-28 15:25:08 · 899 阅读 · 1 评论
分享