C++
文章平均质量分 96
C++学习
CodeWinter
19级,CS专业,一直在努力的路上
展开
-
【C++ STL】模拟实现 unordered_set/map 系列容器(对一张哈希表进行封装)
unordered 系列容器(unordered_map / unordered_set …),其底层封装了一张哈希表(开散列、哈希桶),重点在于哈希表的结构以及相关的接口的实现。哈希表(哈希桶)的结构:这里直接拿我们自己写的开散列(原先是KV模型的)改造下,使其既可兼容K模型,也可兼容KV模型:哈希表里面具体存的是什么类型的元素,是由模板参数 T 来决定:哈希表节点结构:1.2 定义哈希表的迭代器迭代器的结构:👉注意:哈希表迭代器封装的是「节点指针」和「哈希表指针」,因为要在哈希表中找下一个桶,所.原创 2022-07-01 20:36:25 · 472 阅读 · 0 评论 -
【C++ STL】哈希 Hash(闭散列、开散列介绍及其实现)
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到 O(log2N),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个 unordered 系列的关联式容器,这4个容器与红黑树结构的关联式容器底层结构不同,是哈希表(哈希其实就是一种散列,一种映射)哈希表结构的 unordered 系列的关联式容器与红黑树结构的关联式容器 map/set/multimap/mul原创 2022-06-26 18:30:21 · 2208 阅读 · 0 评论 -
【C++ STL】模拟实现 map 和 set(对一颗红黑树进行封装)
阅读STL源码就可以发现,其实 set 和 map 自己没有实现啥东西,整体就是对红黑树进行了一个封装,set 和 map 的 insert / erase 接口底层就是调用红黑树的 insert / erase 接口,并且 set 和 map 的迭代器也都是取的红黑树里面的迭代器那 set 和 map 的核心区别在哪里呢?set 底层封装了一颗红黑树,是 KV 结构,值得注意的是 key_type 和 value_type 都是 key,说明传了两个 key 给红黑树。map 底层封装了一颗红黑树,是原创 2022-06-25 22:31:44 · 643 阅读 · 0 评论 -
【二叉树进阶】红黑树(Red Black Tree) - 平衡二叉搜索树
红黑树,是一种平衡二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是 Red 或 Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出2倍,因而是接近平衡的。AVL树和红黑树:红黑树更多是一种折中的选择,它舍弃平衡二叉树的严格平衡,换取节点插入时尽可能少的调整。因为红黑树的旋转情况少于AVL树,使得红黑树整体性能略优于AVL树,不然map和set底层怎么会用红黑树呢,包括很多语言的库里面都用了红黑树。如果发明AVL树的人是天才的话,那么发明红原创 2022-06-21 17:42:52 · 3048 阅读 · 2 评论 -
【二叉树进阶】AVLTree - 平衡二叉搜索树
二叉搜索树的插入和删除操作都必须先查找,查找效率代表了二叉搜索树中各个操作的效率。但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度为O(N),因此 map、set 等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡二叉搜索树来实现。最优情况下,有 n 个结点的二叉搜索树为完全二叉树,查找效率为:O(log2N)最差情况下,有 n 个结点的二叉搜索树退化为单支树,查找效率为:O(N)平衡二叉搜索树(Self-balancing binary s原创 2022-06-20 17:20:46 · 2421 阅读 · 0 评论 -
【C++ - STL】set、map、multiset、multimap 容器(介绍、使用、应用场景)
序列式容器,比如:vector、list、deque、forward_list(C++11)等,其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是 结构的键值对,在数据检索时比序列式容器效率更高。根据应用场景的不同,STL总共实现了两种不同结构的关联式容器:「树型结构」与「哈希结构」。树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四...原创 2022-06-16 17:33:25 · 1474 阅读 · 1 评论 -
【二叉树进阶】二叉搜索树的结构、实现及应用
普通的二叉树单纯用来存储数据意义不大,还不如用数组和链表。普通数组和链表,面对一些需要频繁查找、插入、删除的场景,也很麻烦。所以这里引入了二叉搜索树。二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:二叉搜索树的结构特点带来的好处:定义二叉搜索树节点类模板:定义二叉搜索树类模板:2.2 默认成员函数的实现2.2.1 构造函数2.2.2 拷贝构造函数(要弄懂)2.2.3 赋值运算符重载(要弄懂)2.2.4 析构函数三、二叉搜索树的相关接口实现3.1 二叉搜索树原创 2022-06-15 21:14:22 · 936 阅读 · 0 评论 -
【C++】多态
多态按字面的意思就是多种形态,当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。多态是在继承关系中不同的类对象,去调用同一函数,产生了不同的行为。比如 Student 继承了 Person。Person 对象买票全价,Student 对象买票半价。在继承中要构成多态有两个条件缺一不可:满足上述条件后,基类的指针指向基类对象则调用基类的虚函数,指向派生类原创 2022-06-12 20:58:09 · 234 阅读 · 0 评论 -
【C++】继承
面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果。当创建一个类时,不需要重新编写新的数据成员和成员函数,只需指定新建的类去继承一个已有的类即可。这个已有的类称为基类(父类),新建的类称为派生类(子类)。继承(inheritance)机制是面向对象程序设计中使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序原创 2022-06-07 13:00:50 · 421 阅读 · 0 评论 -
【C++】模板(template)进阶
模板参数分为「类型形参」与「非类型形参」,注意:不管哪种模板参数,都可以给「缺省值」。类型形参:出现在模板参数列表中,跟在 class 或者 typename 之后的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。比如:C++11 增加了一个容器 array,就是一个静态数组,通过非类型模板参数来控制数组的大小:👉 Example:只是举例子,不推荐这样写现在实现了一个静态栈,可以存 10 个数据,实例化的每个对象都可以存 1原创 2022-06-02 11:25:26 · 1746 阅读 · 15 评论 -
【C++ STL】容器适配器 Container adapter(stack & queue & priority_queue)
文章目录一、STL - stack1.1 stack 的介绍1.2 stack 的使用1.3 stack 的模拟实现二、STL - queue 的介绍2.1 queue 的介绍2.2 queue 的使用2.3 queue 的模拟实现三、STL - priority_queue3.1 priority_queue 的介绍3.2 priority_queue 的使用3.3 仿函数(⭐重要)① 什么是仿函数② 模板实例化时,仿函数的使用3.4 priority_queue 的模拟实现四、容器适配器4.1 什么是容原创 2022-05-27 15:19:01 · 552 阅读 · 0 评论 -
【C++ STL】list 容器(介绍、使用、@迭代器失效、@迭代器的分类与实现方式、模拟实现、list 和 vector 的对比)
文章目录一、STL - list 的介绍二、list 的使用2.1 常见构造2.2 迭代器及其遍历操作2.3 容量操作2.4 访问操作2.5 修改操作① 迭代器失效(⭐)② 成员 / 非成员 swap 函数2.6 容器操作(了解,用的很少)三、容器迭代器(重要)3.1 容器迭代器的分类(⭐重要)3.2 迭代器的实现方式分析(⭐重要)四、stl_list 源码剖析4.1 list 的底层结构五、list 的模拟实现5.1 list 的节点结构5.2 list 的迭代器(⭐重要)① 迭代器的结构② 一些思考(⭐原创 2022-05-25 16:13:28 · 673 阅读 · 7 评论 -
【C++ STL】vector 容器(介绍、使用、@迭代器失效问题、模拟实现、动态二维数组)
文章目录一、STL - vector 的介绍二、vector 的使用(常用接口介绍)2.1 常见构造2.2 迭代器及遍历操作2.3 容量操作2.4 访问操作2.5 修改操作2.6 vector 迭代器失效问题(⭐重要)2.7 补充:其它接口三、源码剖析:vector 的底层结构四、vector 的模拟实现4.1 vector 的结构4.2 vector 的迭代器4.3 一些成员函数的实现① 默认成员函数② 容量操作使用 memcpy 浅拷贝的问题(⭐)解决 memcpy 浅拷贝的问题(⭐)③ 访问操作④ 修原创 2022-05-24 12:44:25 · 731 阅读 · 4 评论 -
【C++ STL】string 容器(介绍、使用、深浅拷贝、模拟实现、写时拷贝)
文章目录前言一、STL - string 的介绍二、string 的使用(常用接口介绍)2.1 常见构造2.2 容量操作2.3 访问操作2.4 迭代器及遍历操作2.5 修改操作2.6 string 类的非成员函数重载2.7 补充一些接口三、string 类的模拟实现3.1 深浅拷贝(⭐重要)① 浅拷贝 & 深拷贝② 拷贝构造 & 赋值运算符重载(传统写法)③ 拷贝构造 & 赋值运算符重载(现代写法)3.2 string 类的结构3.3 string 类的迭代器3.4 一些成员函数的实原创 2022-05-22 10:18:21 · 964 阅读 · 12 评论 -
【C++】模板(template)初阶
文章目录一、认识模板1.1 泛型编程1.2 函数模板1.2.1 概念1.2.2 函数模板的格式1.2.3 函数模板的原理1.2.4 函数模板的实例化1.2.5 模板参数的匹配原则1.3 类模板1.3.1 概念1.3.2 类模板的格式1.3.3 类模板的实例化1.4 笔试题一、认识模板1.1 泛型编程C语言不支持泛型编程,C++支持泛型编程。比如:如何实现一个通用的交换函数呢?void Swap(int& left, int& right){ int temp = left;原创 2022-05-08 19:24:47 · 1753 阅读 · 0 评论 -
【C++】内存管理(C/C++内存分布、new / delete的使用及其底层原理、operator new / operator delete函数、内存泄漏)
文章目录一、C/C++内存分布二、C++内存管理方式2.1 C语言 的动态内存管理方式2.2 C++ 的内存管理方式三、new & delete 底层3.1 operator new 与 operator delete 函数(重点)3.2 总结一下3.3 重载类专属的 operator new 与 operator delete 函数(了解)四、new & delete 的原理(重要)五、定位 new 表达式(placement-new)六、常见面试题七、内存泄漏7.1 内存泄漏及其内存泄原创 2022-05-04 20:34:24 · 272 阅读 · 8 评论 -
【C++】类和对象(三)
文章目录一、再谈构造函数1.1 初始化与赋值1.2 初始化列表(==重要==)1.3 explicit 关键字二、static 静态成员三、成员初始化的新玩法(C++11)四、友元4.1 友元函数4.2 友元类五、内部类六、再次理解封装七、再次理解面对对象一、再谈构造函数1.1 初始化与赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。class Date {public: Date(int year, int month, int day) { _year =原创 2022-05-01 10:03:04 · 601 阅读 · 15 评论 -
【C++】类和对象(二)
文章目录一、类的默认成员函数二、构造函数2.1 概念2.2 特性2.3 补充:成员变量的命名风格三、析构函数3.1 概念3.2 特性四、拷贝构造函数4.1 概念4.2 特性五、运算符重载5.1 概念5.2 赋值运算符重载5.3 常见的运算符重载应用:实现一个日期类六、const6.1 const 修饰类成员函数6.2 取地址及 const 取地址运算符重载七、补充:编译器对传值传参和传值返回的优化一、类的默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不原创 2022-04-30 12:13:25 · 1611 阅读 · 24 评论 -
【C++】类和对象(一)
文章目录一、初步认识面向过程和面向对象二、类的引入C 和 C++ 中「 struct 」的区别三、类的定义四、类的访问限定符及封装4.1 类的访问限定符4.2 类的封装五、类的作用域六、类的实例化6.1 类成员的声明与定义(要搞清楚)七、类对象模型7.1 类对象的存储方式7.2 计算类对象的大小7.3 结构体内存对齐规则八、this 指针8.1 this 的引出8.2 this 指针的特性一、初步认识面向过程和面向对象面向对象:OO, Object - Oriented面向过程:PO, Procedu原创 2022-04-29 23:03:16 · 1661 阅读 · 24 评论 -
【C++初阶】C++入门二(引用、内联函数、auto、范围for、nullptr等)
文章目录(1)引用(很重要)1)引用的概念2)引用的特性3)常引用4)引用的使用场景1、做函数参数2、做函数返回值(要非常的谨慎)5)传值&传引用的效率比较6)值返回&引用返回的性能比较(2)引用和指针的区别(3)内联函数1)内联函数的概念2)内联函数的特性下面的内容仅是为了提前了解一下,让我们对C++有一个整体的概念:(4)auto关键字(C++11)1)auto简介2)auto的使用规则3)auto不能推导的场景(5)基于范围的for循环(C++11)1)范围for的语法2)范围for的原创 2021-10-15 12:31:10 · 450 阅读 · 18 评论 -
【C++初阶】C++入门一(命名空间、输入&输出、缺省参数、函数重载等)
文章目录(1)前言(2)C++关键字(C++98)(3)命名空间1)命名空间的定义2)命名空间的使用(3)C++的输入&输出(4)缺省参数1)缺省参数的概念2)缺省参数的分类(5)函数重载(6)extern "c"(1)前言C++是C语言的继承,兼容绝大多数C的语法,在其基础上增加了一些语法,一般是为了解决C语言做不到的事情、修改不够好的地方什么是C++C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了原创 2021-10-10 20:03:51 · 594 阅读 · 19 评论