![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 90
大桑树保安队
这个作者很懒,什么都没留下…
展开
-
【C++从入门到到踹门】第二十一篇:C++11
1. 统一列表初始化{} 初始化STL的 initializer_list 类2. 声明autodecltypenullptr3. C++11新增STL4. 右值引用与移动语义左值与右值左值引用与右值引用标准库 move 函数移动语义完美转发5. 类的默认成员函数与关键字 default 和 delete默认成员函数强制生成默认函数的关键字禁止生成默认函数的关键字delete6. lambda 表达式引入lambda 表达式仿函数类和lambda表...原创 2022-07-23 21:50:44 · 517 阅读 · 0 评论 -
如果在构造函数中抛出异常,最好的做法是防止内存泄漏?
如果在构造函数中抛出异常,析构函数将不会被调用(简单类,不继承).因此,如果在构造函数中抛出异常,并且有一些堆内存未被清除的机会.那么这里最好的做法是什么?如果你避免“裸”资源(如裸指针,裸互斥体等),并将所有内容都包含在具有适当RAII行为的容器或类中,那么即使存在异常,也不会有您所描述的问题.也就是说,不要在构造函数中获取裸资源.而是创建一个本身跟随RAII的对象的实例.这样,即使您的构造函数失败(即创建实例的构造函数),将调用初始化对象的析构函数.所以,这是不好的做法:输出:一个更正的例子:输出转载 2022-07-04 20:58:49 · 191 阅读 · 0 评论 -
【C++从入门到踹门】第二十篇:布隆过滤器
在使用新闻app看新闻时,一旦刷新就会为我们不停地推荐新的内容,他每次推荐时要去重,过滤掉哪些已经浏览过的内容。那么新闻客户端是如何去重的呢?服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时先对历史记录进行过滤,滤掉重复的内容。那么它又是如何进行快速查找的呢?我们可以想到如下的方法:布隆过滤器是一个大型位图(bit数组)+多个无偏哈希函数。一个bit数组:如果我们要映射一个值到布隆过滤器中,则需要使用多个不同的无偏哈希函数来生成多个哈希值,并对每个哈希值所指向的bit位置为1。无偏哈希函数就是能把元原创 2022-06-20 12:10:26 · 722 阅读 · 0 评论 -
【C++从入门到踹门】第十九篇:bitset(位图)的使用与实现
常规的想法是将40亿个数存入数组中,快速排序然后采用二分法查找,时间复杂度O(NlogN).或者是将一堆数存入unordered_set容器中,使用find进行查找,时间复杂度为O(N)。但是内存空间存不下这么多的数字:40亿≈232=22 * 2^10 * 2^10 * 2^10=4 * 1024 * 1024 * 1024 = 4G每个整数占4字节,所以40亿个整数占用16G字节的空间而一台32位机的内存地址有32位,每个地址指向1字节(8bits)的数据,其内存地址空间的大小只有2^32=4G字节的空原创 2022-06-10 23:27:48 · 5123 阅读 · 0 评论 -
【C++从入门到踹门】第十八篇(下):使用哈希表封装unorder_map和unordered_set
unorder_set是K模型的容器,unorder_map是KV模型的容器要想使用哈希表同时适配K模型和KV模型,就只能对哈希表的模板参数给出控制。同时unorder_set 和 unorder_map 需要给出解析key的仿函数KeyOfValue框架如下:哈希表 HashTable 的基本框架:其中find,insert,erase函数已在上篇中实现,这里还需略作修改unordered_map 基本框架unordered_set 基本框架一个类型做map/set的Key的要求,能支持原创 2022-06-06 20:28:02 · 395 阅读 · 2 评论 -
【C++从入门到踹门】第十八篇(上):哈希表实现
哈希概念什么是哈希表直观了解哈希哈希冲突哈希函数哈希冲突处理闭散列 —— 开放定址法哈希表开散列哈希表闭散列实现Hash仿函数哈希表基本框架查找函数——find插入元素——insert删除函数——erase哈希表开散列实现基础结构查找元素 —— find插入元素 —— insert删除元素 —— erase如何设置哈希表的大小(拓展)......原创 2022-06-03 16:09:40 · 1045 阅读 · 2 评论 -
【C++从入门到踹门】第十七篇(下):map与set实现
目录基本框架红黑树仿函数 KeyofValue红黑树迭代器operator* 和 operator->operator== 和 operator!=operator++ 和 operator--反向迭代器封装成map和set的迭代器完善类功能插入结点——insert函数下标访问——operator[]函数删除结点——erase函数完整代码基本框架红黑树是map和set的底层数据结构,红黑树的代码实现戳红黑树实现现在要用红黑树封装出map和set两个容器,过程中需要对红黑树略加修改,读者可以打开原创 2022-05-31 11:31:00 · 222 阅读 · 1 评论 -
【C++从入门到踹门】第十七篇(上):红黑树的实现
目录1.红黑树的概念2.红黑树结点定义3.红黑树结构4.红黑树的插入操作5.红黑树的验证遍历平衡性6.红黑树的删除7.红黑树与AVL树1.红黑树的概念红黑树首先是一棵二叉搜索树,但在每个结点包含一个颜色信息(Red or Black)。通过对任何一条根到叶子的路径上各个结点着色的限制,红黑树可以确保根到各个叶子结点的最长路径最多是最短路径的两倍——近似平衡。相较于AVL树虽然达不到完全平衡,如搜索10亿个数据,AVL数需搜索30次(2^30),而红黑树可能最多需要搜索60次(这对于CPU而言没有区别)原创 2022-05-29 12:03:50 · 657 阅读 · 13 评论 -
【C++从入门到踹门】第十六篇:AVL树
1.AVL树的概念2. AVL树的插入3.AVL树的旋转(出现不平衡子树)单旋转左单旋右单旋双旋转右左双旋左右双旋4.AVL树的验证5.AVL树的查找6.AVL树的删除7.AVL树的键值访问及修改原创 2022-05-26 11:46:11 · 136 阅读 · 0 评论 -
【C++从入门到踹门】第十五篇:set 和 map
关联式容器键值对setset的使用multisetset 应用举例mapmap的使用multimapmap的应用举例原创 2022-05-26 11:25:15 · 472 阅读 · 0 评论 -
【C++从入门到踹门】第十四篇:二叉搜索树
目录二叉搜索树的概念操作与实现二叉搜索树二叉搜索树的拷贝构造,赋值重载,析构函数二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除应用性能分析二叉搜索树的概念以递归的方式来定义二叉搜索树:若它的左子树不为空,那么它左子树上所有结点的值都小于根节点的值。若它的右子树不为空,那么它右子树上所有结点的值都大于根结点的值。它的左右子树也为二叉搜索树。操作与实现二叉树结点的结构体:template<class K>struct BSTreeNode{ BSTreeNode<原创 2022-05-26 11:05:31 · 124 阅读 · 0 评论 -
【C++从入门到踹门】第十三篇:多态
1.多态概念2.多态实现2.1 构成多态的条件2.2 虚函数的重写虚函数重写特例2.3 虚函数性质2.4 override 、final (C++11)2.5 重载、覆盖(重写)、隐藏(重定义)的区别3.抽象类3.1 抽象类的概念3.2 接口继承和实现继承4.多态的原理4.1 虚函数表4.2 多态原理4.3 动态绑定与静态绑定5.单继承与多继承的虚函数表5.1 单继承虚函数表5.2 多继承虚函数表5.3 打印虚表中的虚函数地址5.3 菱形虚拟继承6.继承与多态常见问题原创 2022-04-25 21:06:40 · 1604 阅读 · 6 评论 -
【C++从入门到踹门】第十二篇:继承
目录1.继承的概念概念继承的定义继承格式继承关系与访问限定符的组合关系父类与子类的赋值转换2. 继承的作用域3. 子类的默认成员函数什么时候需要自己写默认成员函数?4. 继承与友元5. 继承与静态成员6. 继承方式(菱形继承,虚拟继承)虚拟继承7. 继承的总结1.继承的概念概念之前谈到过的函数模板与类模板都是为了能够使代码复用起来,继承机制是面向类设计的复用手段,它允许程序员在保有原有类特性的基础上进行扩展,在其上增加功能,这样产生的类便不用再写冗余代码了。先写个父类:class Person原创 2022-04-15 13:01:35 · 1144 阅读 · 0 评论 -
【C++从入门到踹门】第十篇:stack,queue,priority_queue实现
目录stack的实现了解deque实现stackqueue的实现deque 的优势priority_queue的实现heap 堆heap 算法加入新元素删除堆顶元素实现简单 priority_queue仿函数less 仿函数greater 仿函数priority_queue 的实现代码全貌stack的实现stack 的本质是一个容器适配器。适配器是一种机制,通过修改已有容器的接口来形成我自己的风格。一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型。观察stack的模板原创 2022-04-02 16:22:58 · 1563 阅读 · 1 评论 -
【C++从入门到踹门】 第九篇:list的实现
目录list的实现简单造个轮子(版本:1.0)🚩迭代器🚩list的迭代器 iterator🚩const_iterator针对const对象的迭代器合并两个迭代器版本 2.0🚩造一个好用的轮子(版本3.0)构造函数拷贝构造赋值运算符重载clear 函数insert 函数earse 函数push_front pop_back pop_front 函数🚩反向迭代器 (版本4.0)代码全貌list的实现简单造个轮子(版本:1.0)list在STL中的结构是一个带头双向链表,首先创建结点结构体作为链表单元:原创 2022-03-18 23:49:39 · 1405 阅读 · 0 评论 -
【C++从入门到踹门】 第八篇:vector的实现
STL模拟实现 ☞ vector原创 2022-03-18 23:42:26 · 1204 阅读 · 0 评论 -
【C++从入门到踹门】 第七篇:模拟string
目录string的使用默认成员函数构造函数拷贝构造函数赋值重载函数析构函数迭代器相关函数begin和end 以及 rbegin和rend容量管理相关函数size 、 capacityreserve 、 resizeclear 、 empty寻找与访问字串相关函数operator[]c_strfindrfind修改字串函数push_backappend+=pop_backinserterase关系运算符重载流运算符重载string的使用首先熟悉string的使用,可以参考string使用手册stri原创 2022-03-04 14:50:34 · 665 阅读 · 0 评论 -
“指针常量引用” , int const*,const int* ,const int*& ,int* const&区别详解
“指针常量引用” , int const*,const int* ,const int*& ,int* const&区别详解原创 2022-02-23 11:59:42 · 2409 阅读 · 0 评论 -
【C++从入门到踹门】第五篇:new与delete
目录1. C/C++的内存分布2. C++的内存管理方式2.1 new和delete操作内置类型2.2 new和delete操作自定义类型4.operator new 和operator delete函数4.1 ``new`` 和 ``operator new``4.2 operator new的三种重载形式4.3 operator delete5.new和delete的实现原理5.1 内置类型5.2 自定义类型6 operator new /operator delete的类专属重载 与 定位new(原创 2022-02-20 10:56:22 · 724 阅读 · 0 评论 -
【C++从入门到踹门】第四篇:类和对象(下)
目录1.再探构造函数——初始化方式1.1 构造函数体内赋初值1.2 初始化列表1.3 explicit关键字1.4 匿名对象2. static 成员2.1 概念2.2 使用特性3. C++11的初始化4.友元4.1 友元函数4.1.1 全局函数作为友元函数4.1.2 成员函数作为友元函数4.1.3 友元函数的说明:4.2 友元类4.2.1 友元类举例4.2.2 成员函数作为友元函数5. 内部类5.1 概念1.再探构造函数——初始化方式1.1 构造函数体内赋初值创建对象时,在调用的函数体内为对象的成原创 2022-02-18 19:41:35 · 670 阅读 · 0 评论 -
日期类的实现
日期类头文件 (Date.h)源文件(Date.cpp)构造函数日期+=天数日期相加日期-=天数日期的相减日期的前后比较两个日期的相减日期的前置后置的 ++ --利用前置++,重写日期相减头文件 (Date.h)#pragma once#include <iostream>#include <assert.h>#include <stdbool.h>using std::cout;using std::cin;using std::endl;cl原创 2022-02-11 16:47:40 · 417 阅读 · 0 评论 -
【C++从入门到踹门】第三篇:类和对象(中)类的默认成员函数
目录1.类的默认成员函数2.构造函数2.1 构造函数引入2.2 构造函数概念及特点3. 析构函数3.1 析构函数引入3.2 析构函数的概念3.3 在哪些情况下会程序会执行析构函数?3.4调用构造函数和析构函数的顺序3.5 编译器默认生成的析构函数4. 拷贝构造函数4.1 拷贝构造函数引入4.2 拷贝构造函数概念5.赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载6. const成员6.1 const 修饰类的成员函数7. 取地址及const取地址操作符重载1.类的默认成员函数当一个类中什么不原创 2021-12-22 16:39:54 · 1053 阅读 · 1 评论 -
【C++从入门到踹门】第二篇:类和对象(上)
目录1.面向过程与面向对象2.类的引入3.类的定义4.类的访问限定符5.类与对象5.1 类的实例化5.2.类的大小计算5.3内存对齐规则结构体大小的计算6. this指针6.1 this指针引出6.2 理解this指针1.面向过程与面向对象C语言是面向过程的,注重求解问题的步骤,通过函数调用逐步解决问题。C++面向对象,将事情拆解为多个对象,再靠对象之间的交互完成。举个不恰当的比方,将实现一个工程比作“造桥”的话,C语言“造桥”就好比当场现做混凝土再浇筑,而C++则先在工厂完成结构件预浇筑(制原创 2021-12-13 21:21:24 · 1184 阅读 · 0 评论 -
【C++从入门到踹门】第一篇:初识C++
1.C++的起源对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象原创 2021-12-01 16:03:15 · 1015 阅读 · 0 评论