
C++
文章平均质量分 93
C++相关知识
2021dragon
越努力越幸运
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++知识总结(内附超详细知识框架图)
由于在学习C++的同时博主也在学习Linux系统编程、Linux网络编程以及数据库,所以从开始学习C++到现在结束已经有一年多时间了。C++是博主学习的第一个面向对象的语言,在学习过程中也是逐渐体会到了面向对象编程的种种好处,但C++相比C语言来说其语法会更加复杂,特别是继承和多态的语法(ಥ _ ಥ),以及C++11中新增的很多特性,让C++的语法变得更加复杂。下面博主将各大模块的思维导图罗列出来了,并在每张思维导图下面放上了博主的相关博客,对某一知识点有疑问的博友可以跳转阅读对应的博客。原创 2022-10-04 20:57:19 · 65362 阅读 · 79 评论 -
C++的类型转换
C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。C语言中有两种形式的类型转换,分别是隐式类型转换和显式类型转换:隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。需要注意的是,只有相近类型之间才能发生隐式类型转换,不相近类型之间只能进行强制类型转换。原创 2022-10-02 17:18:09 · 6723 阅读 · 24 评论 -
C++智能指针
实现智能指针时需要考虑以下三个方面的问题:1. 在对象构造时获取资源,在对象析构的时候释放资源,利用对象的生命周期来控制程序资源,即RAII特性。2. 对*和->运算符进行重载,使得该对象具有像指针一样的行为。3. 智能指针对象的拷贝问题。概念说明:RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、互斥量等等)的简单技术。原创 2022-09-29 09:00:15 · 6119 阅读 · 31 评论 -
C++异常
异常是面向对象语言常用的一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数直接或间接的调用者处理这个错误。throw:当程序出现问题时,可以通过throw关键字抛出一个异常。try:try块中放置的是可能抛出异常的代码,该代码块在执行时将进行异常错误检测,try块后面通常跟着一个或多个catch块。catch:如果try块中发生错误,则可以在catch块中定义对应要执行的代码块。原创 2022-09-24 17:22:42 · 3714 阅读 · 30 评论 -
C++11 ——— 线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如Windows和Linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行了支持,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。原创 2022-09-21 16:57:05 · 6698 阅读 · 33 评论 -
C++11——— 包装器
function包装器function是一种函数包装器,也叫做适配器。它可以对可调用对象进行包装,C++中的function本质就是一个类模板。Ret:被包装的可调用对象的返回值类型。Args...:被包装的可调用对象的形参类型。包装示例function包装器可以对可调用对象进行包装,包括函数指针(函数名)、仿函数(函数对象)、lambda表达式、类的成员函数。原创 2022-09-18 12:13:33 · 3734 阅读 · 11 评论 -
C++11 ——— lambda表达式
lambda表达式是一个匿名函数,恰当使用lambda表达式可以让代码变得简洁,并且可以提高代码的可读性。lambda表达式书写格式:[capture-list](parameters)mutable->return-type{statement}原创 2022-09-14 17:44:46 · 3643 阅读 · 14 评论 -
C++11 ——— 可变参数模板
可变参数模板是C++11新增的最强大的特性之一,它对参数高度泛化,能够让我们创建可以接受可变参数的函数模板和类模板。在C++11之前,类模板和函数模板中只能包含固定数量的模板参数,可变模板参数无疑是一个巨大的改进,但由于可变参数模板比较抽象,因此使用起来需要一定的技巧。在C++11之前其实也有可变参数的概念,比如printf函数就能够接收任意多个参数,但这是函数参数的可变参数,并不是模板的可变参数。原创 2022-09-11 17:32:09 · 11411 阅读 · 10 评论 -
C++11 ——— 类的新功能
在C++11之前,一个类中有如下六个默认成员函数:构造函数、析构函数、拷贝构造函数、拷贝赋值函数、取地址重载函数、const取地址重载函数。其中前四个成员函数最重要,后面两个成员函数一般不会用到,这里“默认”的意思就是你不写编译器会自动生成。在C++11标准中又增加了两个默认成员函数,分别是移动构造函数和移动赋值重载函数。原创 2022-09-09 12:24:50 · 3317 阅读 · 14 评论 -
C++11 ——— 右值引用和移动语义
传统的C++语法中就有引用的语法,而C++11中新增了右值引用的语法特性,为了进行区分,于是将C++11之前的引用就叫做左值引用。但是无论左值引用还是右值引用,本质都是给对象取别名,左值引用就是对左值的引用,给左值取别名,通过“&”来声明,右值引用就是对右值的引用,给右值取别名,通过“&&”来声明。原创 2022-09-07 15:49:56 · 5117 阅读 · 17 评论 -
C++11入门基础
在2003年C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称。但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。原创 2022-09-04 16:03:24 · 5007 阅读 · 11 评论 -
特殊类设计
请设计一个类,只能在堆上创建对象;请设计一个类,只能在栈上创建对象;请设计一个类,不能被拷贝;请设计一个类,不能被继承;请设计一个类,只能创建一个对象(单例模式)原创 2022-08-30 14:35:40 · 2925 阅读 · 16 评论 -
海量数据处理面试题
海量数据处理是指基于海量数据的存储和处理,正因为数据量太大,所以导致要么无法在短时间内迅速处理,要么无法一次性装入内存。对于时间问题,就可以采用位图、布隆过滤器等数据结构来解决。对于空间问题,就可以采用哈希切割等方法,将大规模的数据转换成小规模的数据逐个击破。......原创 2022-08-27 15:26:43 · 2701 阅读 · 13 评论 -
哈希的应用 —— 布隆过滤器
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询。布隆过滤器其实就是位图的一个变形和延申,虽然无法避免存在哈希冲突,但我们可以想办法降低误判的概率。当一个数据映射到位图中时,布隆过滤器会用多个哈希函数将其映射到多个比特位,当判断一个数据是否在位图当中时,需要分别根据这些哈希函数计算出对应的比特位,如果这些比特位都被设置为1则判定为该数据存在,否则则判定为该数据不存在。原创 2022-08-25 15:08:05 · 2382 阅读 · 11 评论 -
STL详解(十五)—— bitset(位图)的模拟实现
文章目录原创 2022-01-21 11:35:32 · 2566 阅读 · 12 评论 -
STL详解(十四)—— bitset(位图)的介绍与使用
文章目录bitset的介绍bitset的使用bitset的介绍bitset的使用原创 2022-01-19 12:56:20 · 3722 阅读 · 19 评论 -
STL详解(十三)—— 用一个哈希表同时封装出unordered_map和unordered_set
文章目录原创 2022-01-16 17:23:52 · 2731 阅读 · 13 评论 -
STL详解(十二)—— unordered_set、unordered_map的介绍及使用
文章目录unordered_set和unordered_map的介绍unordered_set的使用unordered_set的定义方式unordered_set接口的使用unordered_multisetunordered_map的使用unordered_map的定义方式unordered_map接口的使用unordered_multimapunordered_set和unordered_map的介绍unordered_set的使用unordered_set的定义方式方式一: 构造一个某类型的空原创 2022-01-07 11:45:22 · 16981 阅读 · 18 评论 -
C++中map/set和unordered_map/unordered_set的区别及其适用情况
文章目录map/set与unordered_map/unordered_set的区别map/set与unordered_map/unordered_set性能测试测试结论map/set与unordered_map/unordered_set的区别map/set与unordered_map/unordered_set性能测试测试结论根据测试结果可以得出以下结论:当处理数据量小时,map/set容器与unordered_map/unordered_set容器增删查改的效率差异不大。当处理数据量大时原创 2022-01-02 12:50:05 · 3939 阅读 · 20 评论 -
C++多态
文章目录多态的概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外C++11 override和final重载、覆盖(重写)、隐藏(重定义)的对比抽象类概念接口继承和实现继承多态的原理虚函数表多态的原理动态绑定和静态绑定单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表菱形继承、菱形虚拟继承继承和多态常见的面试问题概念考察问答题多态的概念多态就是函数调用的多种形态,使用多态能够使得不同的对象去完成同一件事时,产生不同的动作和结果。例如,在现实生活当中,普通人买票是原创 2021-10-20 18:44:24 · 8833 阅读 · 34 评论 -
C++继承
文章目录继承的概念及定义继承的概念继承的定义基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员菱形继承及菱形虚拟继承继承的总结和反思笔试面试题汇总继承的概念及定义继承的概念继承的定义基类和派生类对象赋值转换继承中的作用域派生类的默认成员函数继承与友元继承与静态成员菱形继承及菱形虚拟继承继承的总结和反思笔试面试题汇总...原创 2021-10-12 21:59:24 · 7490 阅读 · 22 评论 -
C++的IO流
文章目录C语言的输入与输出流是什么C++标准IO流C++文件IO流stringstream的介绍C语言的输入与输出在C语言当中,我们使用最频繁的输入输出方式就是scanf与printf:scanf: 从标准输入设备(键盘)读取数据,并将读取到的值存放到某一指定变量当中。printf: 将指定的数据输出到标准输出设备(屏幕),使用时需要注意宽度输出和精度输出的控制。C语言借助了相应的缓冲区来进行输入与输出,如下图所示:对输入输出缓冲区的理解:可以屏蔽掉低级I/O的实现。 低级I/O的实现依原创 2021-09-18 12:48:08 · 4108 阅读 · 19 评论 -
C++模板进阶操作 —— 非类型模板参数、模板的特化以及模板的分离编译
文章目录非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化模板的分离编译什么是分离编译模板的分离编译解决方法模板总结非类型模板参数模板参数可分为类型形参和非类型形参。类型形参: 出现在模板参数列表中,跟在class或typename关键字之后的参数类型名称。非类型形参: 用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。例如,我们要实现一个静态数组的类,就需要用到非类型模板参数。template<class T, size_t N> //原创 2021-09-16 08:40:02 · 10076 阅读 · 12 评论 -
C++模板详解 —— 函数模板与类模板
文章目录泛型编程函数模板函数模板的概念函数模板的格式函数模板的原理函数模板的实例化函数模板的匹配原则类模板类模板的定义格式类模板的实例化泛型编程函数模板函数模板的概念函数模板的格式函数模板的原理函数模板的实例化函数模板的匹配原则类模板类模板的定义格式类模板的实例化.........原创 2021-06-07 15:11:30 · 5946 阅读 · 32 评论 -
STL详解(十一)—— 用一棵红黑树同时封装出map和set
文章目录用一棵红黑树同时封装出map和set原创 2021-12-11 17:36:44 · 4739 阅读 · 38 评论 -
STL详解(十)—— set、map、multiset、multimap的介绍及使用
文章目录关联式容器键值对树形结构的关联式容器setset的介绍set的使用mapmap的介绍map的使用multisetmultiset的介绍multiset的使用multimapmultimap的介绍multimap的使用总结关联式容器键值对树形结构的关联式容器setset的介绍set的使用mapmap的介绍map的使用multisetmultiset的介绍multiset的使用multimapmultimap的介绍multimap的使用总结...原创 2021-11-27 20:53:25 · 7771 阅读 · 33 评论 -
STL详解(九)—— priority_queue的使用与模拟实现
文章目录priority_queue的使用priority_queue的介绍priority_queue的定义方式priority_queue各个接口的使用priority_queue的模拟实现堆的向上调整算法⭐堆的向下调整算法⭐priority_queue的模拟实现priority_queue的使用priority_queue的介绍优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需原创 2021-09-14 12:37:30 · 3546 阅读 · 13 评论 -
STL详解(八)—— stack和queue的模拟实现
文章目录容器适配器stack的模拟实现queue的模拟实现stack和queue的模拟实现都比较简单,所以这里就一起进行实现。容器适配器stack和queue有一点需要注意的是,虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器。在stack和queue的类模板声明当中我们就可以看到,它们的模板参数有两个,第一个是stack和qu原创 2021-09-10 17:51:53 · 1948 阅读 · 15 评论 -
STL详解(七)—— stack和queue的介绍及使用
文章目录stackstack的定义方式stack的使用queuequeue的定义方式queue的使用stack栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。stack的定义方式方式一: 使用默认的适配器定义栈。stack<int> st1;方式二: 使用特定的适配器定义栈。stack<int, vector<int原创 2021-09-04 10:13:24 · 2612 阅读 · 16 评论 -
STL详解(六)—— list的模拟实现
文章目录本次所需实现的三个类及其成员函数接口总览结点类的模拟实现构造函数迭代器类的模拟实现迭代器类存在的意义迭代器类的模板参数说明构造函数++运算符的重载--运算符的重载==运算符的重载!=运算符的重载*运算符的重载->运算符的重载list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载函数析构函数迭代器相关函数begin和end访问容器相关函数front和back插入、删除函数inserterasepush_back和pop_backpush_front和pop_front其他函数sizer原创 2021-08-11 12:06:16 · 3387 阅读 · 18 评论 -
STL详解(五)—— list的介绍及使用
文章目录list的介绍list的使用list的定义方式list的插入和删除push_front和pop_frontpush_back和pop_backinserteraselist的迭代器使用begin和endrbegin和rendlist的元素获取front和backlist的大小控制sizeresizeemptyclearlist的操作函数sortsplicremoveremove_ifuniquemergereverseswaplist的介绍list是一种可以在常数范围内在任意位置进行插入和删除原创 2021-08-08 19:16:20 · 4217 阅读 · 7 评论 -
C++STL详解(四)—— vector的模拟实现
vector的模拟实现原创 2021-08-03 16:08:59 · 3775 阅读 · 19 评论 -
C++STL详解(三)—— vector的介绍及使用
文章目录vector的介绍vector的使用vector的定义方式vector的空间增长问题size和capacityreserve和resizeemptyvector的迭代器使用begin和endrbegin和rendvector的增删查改push_back和pop_backinsert和eraseswap元素访问vector迭代器失效问题vector的介绍1、vector是表示可变大小数组的序列容器。2、vector就像数组一样,也采用的连续空间来存储元素,这也意味着可以采用下标对vector的元原创 2021-07-30 16:18:20 · 4889 阅读 · 8 评论 -
C++STL详解(二)—— string类的模拟实现
文章目录原创 2021-07-22 20:29:22 · 4774 阅读 · 40 评论 -
C++STL详解(一)—— string类
文章目录C++STL详解(一) —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、string中与迭代器相关的函数C++STL详解(一) —— sring类本次内容大纲:一、string的定义方式string类实现了多个构造函数的重载,常用的构造函数如下:st原创 2021-06-14 19:25:59 · 8164 阅读 · 41 评论 -
string类常见题目详解(二)—— 把字符串转换成整数、反转字符串
题目一:把字符串转换成整数题目描述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。数值为0或者字符串不是一个合法的数值则返回0。输入的字符串包括数字字母符号,可以为空。示例: 输入:"+2147483647" 输出:“2147483647”分析: 字符串当中可能包含数字、字母和其他符号,正数可以在前面放上正号,由此可以确定的是,一个字符串一个合法的数值,则除了其第一个字符可能是正号或负号以外,其他字符都应该是数字字符。步骤: 1、先判断除第一个字符以外的字符,若是其中出原创 2021-08-13 12:16:35 · 1196 阅读 · 8 评论 -
string类常见题目详解(一) —— 仅仅反转字母、字符串中的第一个唯一字母、字符串最后一个单词的长度、验证回文串、字符串相加
题目一:仅仅反转字母题目描述: 给定一个字符串,返回“反转后的”字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。示例: 输入:“a-bC-dEf-ghIj” 输出:“j-Ih-gfE-dCba”思路: 使用两个指针,开始时头指针指向字符串开头,尾指针指向字符串末尾(’\0’的前一个字符)。头指针先向后寻找待反转字母,尾指针再向前寻找待反转字母,然后反转这两个待反转字母即可。重复该步骤,直到头指针和尾指针发生错位为止。动图演示:代码:class Solution {p原创 2021-07-14 16:55:17 · 1371 阅读 · 10 评论 -
C/C++内存管理详解
文章目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理方式new和delete操作内置类型new和delete操作自定义类型operator new和operator delete函数new和delete的实现原理内置类型自定义类型定位new和表达式(placement-new)常见面试题malloc/free和new/delete的区别?内存泄漏什么是内存泄漏,内存泄漏的危害?内存泄漏分类?如何检测内存泄漏?如何避免内存泄漏?如何一次在堆上申请4G的内存?C/C++内存分布C语言中动态原创 2021-06-10 18:52:13 · 9536 阅读 · 36 评论 -
类和对象常见题目详解 —— 求1+2+3+...+n、计算一年的第几天、日期差值、打印日期、日期累加
题目一:求1+2+3+…+n题目描述: 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例: 输入:5 返回值:15分析: 若是只看题目不管要求,这是一道非常简单的题目,我们有好几种方式可以得出最终结果,但加上题目限制条件,可能大多数博友都懵了。我们来捋一捋: 1、不能使用乘除法,等差数列求和公式不能用了。 2、不能使用for、while,循环求解不能用了。 3、不能使用switch、case和原创 2021-07-18 11:58:39 · 1644 阅读 · 16 评论 -
C++类和对象(三)
文章目录再谈构造函数构造函数体赋值初始化列表explicit关键字static成员概念特性C++11中成员初始化的新玩法友元友元函数友元类内部类概念及特性再次理解封装再次理解面向对象再谈构造函数构造函数体赋值初始化列表explicit关键字static成员概念特性C++11中成员初始化的新玩法友元友元函数友元类内部类概念及特性再次理解封装再次理解面向对象...原创 2021-06-06 10:13:15 · 7184 阅读 · 61 评论