C++
文章平均质量分 91
今天也要写bug、
编程三问:xx是什么?为什么要有xx?xx是怎么实现的?
展开
-
C++定时器和时间轮
定时器和时间轮原创 2022-09-06 22:58:17 · 2112 阅读 · 1 评论 -
C++实现高并发内存池
C++实现高并发内存池原创 2022-07-16 16:51:36 · 1181 阅读 · 0 评论 -
卡特兰数(Catalan)的应用场景
卡特兰数的应用原创 2022-07-01 15:27:18 · 404 阅读 · 0 评论 -
SizeBalanceTree
SizeBalancedTree的实现原创 2022-06-29 00:07:56 · 339 阅读 · 0 评论 -
可变模版参数函数
文章目录可变模板参数展开参数包递归函数方式展开参数包逗号表达式展开参数包可变模板参数C++11的新特性–可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号“…”。比如我们常常这样声明一个可变模版参数:template<typename…>或者template<c原创 2022-02-11 15:13:46 · 1434 阅读 · 1 评论 -
C++函数包装器
文章目录为什么需要函数包装器函数包装器bind调整可调用类型的参数为什么需要函数包装器function函数包装器也叫适配器,在C++中其本质是一个类模板。由于C++的历史遗留问题,导致如果想实现一个函数功能,可以采用函数名、函数指针、仿函数、有名称的lambda表达式,所有这些都是可调用的类型。它们存在很多问题:函数指针类型太复杂,不方便使用和理解仿函数类型是一个类名,没有指定调用参数和返回值,得去看operator()的实现才能看出来。lambda表达式在语法层,看不到类型,只能在底层看原创 2022-02-11 01:52:49 · 1662 阅读 · 0 评论 -
万能引用,引用折叠,右值变左值的情况
文章目录万能引用引用折叠右值变左值的情况万能引用左值引用只能引用左值,右值引用只能引用右值。但是对于一个函数我们有时候并不清楚传入的参数是左值还是右值,这时候就需要写两个同名的函数重载,而万能引用的出现解决了这个问题。万能引用需要和模板配合使用template<class T>void f(T&& param); 如果一个变量或者参数被声明为T&&,其中T是被推导的类型,那这个变量或者参数就是一个万能引用。当传入的参数是左值的时候,函数就会实例原创 2022-02-09 17:16:41 · 2810 阅读 · 5 评论 -
STL总结
文章目录STL的本质STL的六大组件容器算法迭代器迭代器实现原理迭代器与类的融合反向迭代器适配器仿函数空间配置器STL的本质通俗说:STL是Standard Template Library(标准模板库),是高效的C++程序库,其采用泛型编程思想对常见数据结构(顺序表,链表,栈和队列,堆,二叉树,哈希)和算法(查找、排序、集合、数值运算…)等进行封装,里面处处体现着泛型编程程序设计思想以及设计模式,已被集成到C++标准程序库中。具体说:STL中包含了容器、适配器、算法、迭代器、仿函数以及空间配置器。S原创 2022-02-01 18:34:05 · 2291 阅读 · 1 评论 -
C++中的类型转换
文章目录C语言之中的类型转换为什么C++需要四种类型转换C++强制类型转换static_castreinterpret_cast:const_cast:dynamic_cast:explicitC语言之中的类型转换在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。相近类型,比如int型转化为原创 2022-01-30 21:38:52 · 1351 阅读 · 0 评论 -
C++ 特殊类的设计
文章目录设计一个类,只能在堆上创建对象设计一个类,只能在栈上创建对象设计一个类,不能被拷贝设计一个类,不能被继承设计一个类,只能创建一个对象(单例模式)饿汉模式懒汉模式总结对比一下饿汉模式和懒汉模式的区别设计一个类,只能在堆上创建对象实现方式:将类的构造函数私有,这样就无法在栈或堆上直接定义对象了。提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建(因为,构造函数私有,在外面不能调动,就需要成员函数去调动,而成员函数需要成员调动,但是不能创建成员,因此用一个静态函数去调用构造函数)。创原创 2022-01-30 17:38:41 · 2152 阅读 · 0 评论 -
C++11---智能指针
文章目录一、为什么需要智能指针1.1. 什么是内存泄漏,内存泄漏的危害1.2. 内存泄漏分类1.3. 如何避免内存泄漏二、智能指针的使用及原理2.1. RAII2.2. std::auto_ptr2.3. std::unique_ptr2.4. std::shared_ptr2.4.1. 线程安全问题2.4.2. 循环引用问题2.4.3. 定制删除器三、智能指针的历史四、使用RAII思想设计的锁管理守卫一、为什么需要智能指针程序员自己控制的内存,在一些特殊场景之下,有可能发生内存泄漏,智能指针则可以帮原创 2022-01-27 22:31:54 · 390 阅读 · 0 评论 -
C++11---异常
文章目录一、C语言传统的处理错误的方式二、C++异常概念三、异常的使用3.1. 异常的抛出和捕获3.2. 异常的重新抛出3.3. 异常安全3.4. 异常规范四、自定义异常体系五、C++标准库的异常体系六、异常的优缺点一、C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。C 标准库中setjmp和l原创 2022-01-26 16:17:53 · 352 阅读 · 0 评论 -
C++11---线程库
文章目录一、线程库的介绍1.1. 使用时的注意点1.2. 线程函数参数1.3. join与detach二、原子性操作库2.1. atomic2.2. 锁三、使用lambda表达式创建多个线程四、条件变量一、线程库的介绍在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含&原创 2022-01-26 00:01:50 · 2043 阅读 · 0 评论 -
C++11---lambda表达式
文章目录C++98中的一个例子lambda表达式的格式lambda表达式的原理C++98中的一个例子在C++98中,如果待排序元素为自定义类型,需要用户定义排序时的比较规则:struct Goods{ string _name; double _price;};struct Compare{ bool operator()(const Goods& gl, const Goods& gr) { return gl._price <= gr._price; }原创 2022-01-25 00:19:58 · 1069 阅读 · 0 评论 -
17 C++11常用语法
文章目录一、C++11简介二、列表初始化2.1. 容器如何支持花括号初始化三、变量类型的推导3.1. 编译时类型推导:auto3.2. decltype类型推导3.3. 运行时类型推导 typeid四、final、override五、新增容器六、范围for循环七、默认成员函数控制defaultdelete八、右值引用8.1. 右值引用的移动语义8.2. 移动语义需要注意的问题8.3. 右值引用引用左值move的用法和注意事项8.4. 总结8.5. 完美转发一、C++11简介在2003年C++标准委员原创 2022-01-24 20:56:15 · 4726 阅读 · 6 评论 -
16 哈希的应用---位图和布隆过滤器
文章目录一、位图1.1. 什么是位图1.2. 位图的使用场景1.3. 位图的应用二、位图的定义和成员函数2.1. 定义方式2.2. 常用函数2.3. 运算符的使用三、位图的模拟实现四、布隆过滤器4.1. 布隆过滤器的提出4.2. 布隆过滤器的概念4.3. 布隆过滤器的应用4.4. 布隆过滤器的设计4.5. 布隆过滤器的优缺点五、布隆过滤器的代码实现六、海量数据常见处理方式一、位图1.1. 什么是位图所谓位图就是用每一位来存放某种状态,适用于海量的数据,数据无重复的场景。通常用来判断某个数据在或者不在原创 2022-01-21 18:32:33 · 1485 阅读 · 3 评论 -
15 unordered_map和unordered_set的使用以及用哈希桶模拟实现
文章目录unordered_map,unordered_set,map和set的用法和区别用哈希桶模拟实现unordered_map和unordered_setunordered_map的代码unordered_set的代码哈希表和迭代器的代码unordered_map,unordered_set,map和set的用法和区别在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时的效率可达到 O ( logN ) ,即最差情况下需要比较红黑树的高度次,当树中的结点非常多时,查询效率也原创 2022-01-18 17:14:30 · 1006 阅读 · 0 评论 -
14 哈希表和哈希桶
文章目录一、哈希表二、哈希函数2.1. 直接定址法(常用)2.2. 除留余数法(常用)2.3. 几种不常用的方法三、哈希冲突四、闭散列4.1. 线性探测4.2. 负载因子4.3. 二次探测4.4. 插入和删除操作4.5. 扩容操作4.6. 代码实现五、开散列(哈希桶)5.1. 开散列扩容5.2. 代码实现六、闭散列和开散列的比较一、哈希表哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,通过原创 2022-01-17 16:04:44 · 3911 阅读 · 1 评论 -
13 set和map以及用红黑树模拟实现set和map
文章目录序列容器和关联式容器树形结构与哈希结构setset的成员函数构造方法set当中常用的成员函数multisetmapmap的成员函数构造方法map的插入insertmap的查找findmap的删除erasemap的[ ]运算符重载map的其他成员函数统计出现次数的三种方式对统计的次数进行排序multimap用红黑树模拟实现map和set参数的控制使用仿函数比较参数大小迭代器的实现序列容器和关联式容器C++STL中的部分容器,比如:vector、list、deque、forward_list(C+原创 2022-01-13 17:09:27 · 936 阅读 · 0 评论 -
内联函数inline分文件编译报错的原因
内联函数是不能分文件编译的。如果使用函数内联,则必须在包括的头文件中实现内联函数。如果非要分文件编译,比如函数声明为内联://Add.hinline int Add(int a,int b);//Add.cpp#include"Add.h"int Add(int a,int b){ return a+b;}//main.cpp#include <iostream>#include"Add.h"using namespace std;int main(){原创 2021-11-26 17:44:31 · 3498 阅读 · 1 评论 -
12 C++的多态
文章目录一、多态的概念1.1. 多态的构成条件二、虚函数2.1. 虚函数的重写2.2. 虚函数重写的例外协变:父类与子类虚函数返回值类型不同析构函数的重写(基类与派生类析构函数的名字不同)三、C++11 override和final3.1. final:修饰虚函数,表示该虚函数不能再被重写3.2. override:检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错四、重载、覆盖(重写)、隐藏(重定义)的对比五、抽象类5.1. 抽象类有什么用六、多态的应用场景举例七、多态的实现原理7.1. 虚函原创 2021-11-20 00:22:01 · 22166 阅读 · 7 评论 -
11 C++的继承
文章目录一、继承的概念及定义1.1. 继承方式和访问限定符二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、菱形继承和菱形虚拟继承7.1. 菱形继承导致的问题7.2. 虚拟继承7.3. C++编译器如何通过虚继承解决数据冗余和二义性八、组合和继承的比较总结一、继承的概念及定义继承(inheritance)允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。提高代码的重复利用率,是面向对象的重要一种手段。以前我们接触原创 2021-11-17 19:59:08 · 934 阅读 · 2 评论 -
10 C++的IO流
IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出。文章目录一、C++IO流1.1. C++标准IO流1.2. C++文件IO流使用>>和<<对文件进行读写1.3. 将日期类写入文件并从文件中读取二、stringstream一、C++IO流和C语言的scanf、printf、fread、fwrite等IO类似,C++有自己的IO接口。C++系统实现了一个庞大的类库,这个库叫做IO流,其中ios为基类,其他类都是直接或间接派生自ios类:1.原创 2021-11-13 23:28:49 · 1394 阅读 · 1 评论 -
09 非类型模板参数、模板的特化、分离编译
文章目录一、非类型模板参数二、模板的特化2.1. 函数模板特化2.2. 类模板化全特化偏特化三、模板分离编译3.1 模板为什么不支持分离编译3.2. 模板的优缺点一、非类型模板参数模板参数有两种:1. 类型形参 2. 非类型形参。类型形参:出现在模板参数列表中,跟在class或者typename之后的参数。非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。比如类中需要开辟一个静态数组,但是大小未知,此时就可以使用非类型形参:另外模板参数也可以写为原创 2021-11-13 19:43:22 · 1040 阅读 · 0 评论 -
08 stack、queue和priority_queue的使用和模拟实现
stack和queue在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque容器。文章目录一、容器适配器二、stack模拟实现stack三、queue模拟实现queue四、priority_queue使用优先级队列排序日期类模拟实现priority_queue一、容器适配器容器适配器 是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。 之所以称作适配器类原创 2021-11-11 22:17:59 · 2011 阅读 · 2 评论 -
07 STL中list的用法和模拟实现
文章目录一、list介绍二、常用接口2.1. 构造函数默认构造半缺省构造拷贝构造迭代器构造2.2. 增删查改的接口push_front和pop_frontpush_back和pop_backfindinserterase2.3. 迭代器begin和endrbegin和rend2.4. 元素访问方式front和back迭代器和范围for访问2.5. 大小控制函数sizeresizeemptyclear2.6. list的其他操作函数sortswapspliceremoveremove_ifuniquemerg原创 2021-11-10 10:47:37 · 2025 阅读 · 1 评论 -
06 STL中的vector类和模拟实现
文章目录一、vector的介绍二、常用接口2.1. 构造函数默认构造半缺省构造拷贝构造迭代器构造2.2. 元素访问方式[ ]下标访问迭代器和范围for访问2.3. 空间增长函数size()和capacity()reserve()和resize()capacity增容规则2.4. 增删查改的接口push_back和pop_backinsert和erasefind函数swap2.5. 迭代器begin和endrbegin和rend三、vector迭代器失效的问题3.1. 迭代器失效解决方法四、vector模拟实原创 2021-11-06 23:11:38 · 1014 阅读 · 0 评论 -
05 STL中的string类和模拟实现
string是STL中的类,相比于C语言的字符数组和字符指针,string对字符串的处理方便很多。文章目录一、字符的一些补充二、string类2.1.string类的常见构造函数和析构函数2.2.三种遍历方式2.3.string常用的接口三、string模拟实现3.1.深浅拷贝的问题3.2.命名空间3.3.默认成员函数构造函数析构函数重载赋值运算符=3.4.元素访问函数[]重载find和rfindc_str3.5.容积函数size()和capacity()reserveresizeemptyclear3原创 2021-09-23 00:40:54 · 1214 阅读 · 10 评论 -
04C++中模板和STL介绍
模板和STL是C++比较重要的部分。本章仅做简单了解。文章目录一、模板1.1.函数模板1.1.1.两种函数模板的实例化1.1.2.模板参数的匹配原则1.2.类模板二、STL一、模板对于一个交换函数,虽然C++支持函数重载,我们可以对多个交换函数起相同的名字:void Swap(int& left, int& right) { int temp = left; left = right; right = temp; }void Swap(double& lef原创 2021-09-21 11:15:08 · 1028 阅读 · 4 评论 -
03C++的内存管理----new和delete
C++中变量的内存分布和C语言是一样的。文章目录一、内存分布二、C++的动态内存管理方式2.1.new和delete开辟内置类型和非自定义变量三、new和delete底层3.1.重载专属的operator new和operator delete四、定位new表达式(placement-new)五、malloc/free和new/delete的区别六、内存泄漏一、内存分布程序的本质就是为了管理数据和对数据进行处理,为了更好的保存和管理数据,操作系统对内存进行了划分,不同的数据存放的内存区域不同:原创 2021-09-20 23:47:39 · 1384 阅读 · 3 评论 -
02类和对象
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象和对象之间的交互关系,将一件事情拆分成不同的对象,靠对象之间的交互完成。以外卖系统举例:面向过程就是:下单、接单、送餐的三个过程。面向对象则是:客户、商家、骑手之间的交互关系。文章目录一、类1.1.类的定义1.2.类的访问限定符及封装1.2.1.访问限定符1.2.2.封装1.3.类的作用域1.4.类的实例化1.4.1.类对象的大小1.4.2.给类对象赋值1.5.隐含的this指针1.原创 2021-09-17 00:05:29 · 510 阅读 · 9 评论 -
01C++基础语法
这些语法是对C语言一些不好用的地方的一些补充。也是对学习C++类和对象做铺垫。文章目录第一个C++程序C++的头文件命名空间命名空间的定义命名空间使用嵌套命名空间的使用C++的输入和输出缺省参数缺省参数的分类函数重载函数重载的原因引用引用的特性以及引用和指针的区别第一个C++程序要用C++输出hello world ,代码:#include<iostream>//头文件using namespace std;int main()//主函数{ cout << "原创 2021-09-14 00:46:09 · 483 阅读 · 9 评论
分享