自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 收藏
  • 关注

原创 前缀和与差分数组

当我们需要更新区间[l,r]时候(仅指加减运算),我们仅仅可以只更新d[l]+=x,d[r+1]-=x;

2024-04-10 10:33:05 320

原创 笔记及一些细节

如果是一个二维数组(vector<vector<int>>),也可以用sort,我们可以选择根据某一列来进行排序,如果我们不重写cmp(比较)函数,那么。

2024-02-16 22:03:31 121

原创 C++ -- IO流

使用itoa()函数使用sprintf()函数int main()return 0;但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件 。stringstream主要可以用来:1. 将数值类型数据格式化为字符串

2023-09-25 16:52:52 167

原创 C++ -- 类型转换

static_cast、reinterpret_cast、const_cast和dynamic_caststatic_cast用于相近类型的类型之间的转换,编译器隐式执行的任何类型转换都可用static_cast。reinterpret_cast用于两个不相关类型之间的转换。const_cast用于删除变量的const属性,方便赋值。dynamic_cast用于安全的将父类的指针(或引用)转换成子类的指针(或引用)

2023-09-24 16:05:14 157

原创 C++ -- 特殊类设计

工厂方法模式(Factory Method Pattern)抽象工厂模式(Abstract Factory Pattern)单例模式(Singleton Pattern)建造者模式(Builder Pattern)原型模式(Prototype Pattern)适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)组合模式(Composite Pattern)装饰者模式(Decorator Pattern)

2023-09-23 15:30:05 421

原创 C++11 -- 智能指针

如果输入的除数为0,那么div函数中就会抛出异常,这时程序的执行流会直接跳转到 f1函数中的 catch块中执行,如果 catch块中没有释放空间会导致 f1函数中申请的内存资源没有得到释放,如果申请的资源过多,代码的冗余就会增多,且调试困难。所以为了解决这个问题就出现了智能指针。内存泄漏非常常见,解决方案分为两种:1、事前预防型。如智能指针等。2、事后查错型。如泄漏检测工具。

2023-09-21 23:28:31 68

原创 C++11 -- 线程库

在C++11之前,涉及到多线程问题,都是和平台相关的,比如 windows 和 linux 下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。线程库(thread)、互斥量库(mutex)、原子性操作库(atomic)、条件变量库(condition_variable)

2023-09-21 11:15:00 33

原创 C++11 -- 可变参数模板 + 包装器

/ Args是一个模板参数包,args是一个函数形参参数包// 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。{}上面的参数 args 前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为 “参数包”,它里面包含了0到N(N>=0)个模版参数。Args是一个模板参数包,args是一个函数形参参数包可以在函数模板中通过 sizeof 计算参数包中参数的个数,代码如下注意:sizeof 后面也需要加上参数列表 ... ,不加直接报错。

2023-09-21 01:19:54 128

原创 C++11 -- 异常

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 错误码// 错误信息// 调用栈帧public:{}return "数据库错误" + _errmsg;public:{}return "网络错误" + _errmsg;

2023-09-20 17:36:03 31

原创 C++11 -- lambda表达式

在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法,如果待排序元素为自定义类型,需要用户定义排序时的比较规则,这个比较规则既可以是我们C语言时的函数指针,也可以是C++中的仿函数,,下面的例子就是利用仿函数的方式。随着C++语法的发展,因此,在C++11语法中出现了Lambda表达式。

2023-09-17 17:56:40 23

原创 C++11 -- final与override关键字和类的新功能

默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动赋值,如果实现了就调用移动赋值,没有实现就调用拷贝赋值。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。如果你没有自己实现移动赋值重载函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个,那么编译器会自动生成一个默认移动赋值。默认成员函数就是我们不写编译器会生成一个默认的。

2023-09-17 16:39:17 45

原创 C++11 -- 右值引用

右值引用做参数和作返回值减少拷贝的本质是利用了移动构造和移动赋值左值引用和右值引用本质的作用都是减少拷贝,右值引用本质可以认为是弥补左值引用不足的地方,他们两相辅相成左值引用:解决的是传参过程中和返回值过程中的拷贝做参数: void push(T x) -> void push(const T& x) 解决的是传参过程中减少拷贝做返回值: T f20->T& f20 解决的返回值过程中的的拷贝。

2023-09-15 00:42:11 34

原创 C++ 11 -- 新特性

在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。

2023-09-14 15:18:44 25

原创 C++ 哈希的应用--布隆过滤器

我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的?用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。如何快速查找呢?用哈希表存储用户记录,缺点:浪费空间用位图存储用户记录,缺点:位图一般只能处理整形,如果内容编号是字符串,就无法处理了。将哈希与位图结合,即布隆过滤器。

2023-09-13 16:19:53 43

原创 C++ 哈希的应用--位图

通过这种同样是哈希的思想,就可以极大的节省空间,无符号整形范围在0~2的32次方-1,因此我们可以开2的32次方个比特位,换算下来只有512M的大小,通过直接映射就能够判断。方案1: 将其中一个文件1的整数映射到一个位图中,读取另外一个文件2中的整数,判断在在不在位图,在就是交集。本题还是用两个位表示一个数,分为出现0次00表示,出现1次的01表示,出现2次的10表示出现3次及3次以上的用11表示。先考虑内存的问题:40亿个整数, 每个整数4字节,换算大约16G的空间,寻常的查找算法都是不可能完成的。

2023-08-25 22:31:20 34

原创 C++ 哈希封装unordered_set和unordered_map

unordered_map、unordered_set与map、set的区别是unoedered系列无序,除此之外功能上没有区别。但二者之间底层不同,前者底层为哈希,后者为红黑树。

2023-08-12 15:42:25 46

原创 C++ 哈希表

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立的关系,那么在查找时通过该函数可以很快找到该元素。

2023-08-11 23:36:31 94

原创 C++ 使用红黑树对set和map进行封装

使用前面实现的红黑树封装set和map,set是K模型的容器,map是KV模型的容器。

2023-07-18 20:01:31 37

原创 C++ 红黑树

对于平衡树来说,AVL无疑是最完美的结构,但实际上AVL树由于完美的结构因此也要花费一定的代价,由于AVL树的结构很敏感,查找虽然最快,但插入节点后一旦偏离AVL结构就会进行旋转,而旋转就会花费一定的性能。因此我们提到的map和set的底层为了防止这种性能上的缺失,即便AVL是非常完美的结构,也不采用AVL。而是采用红黑树。

2023-07-13 21:45:00 31

原创 【为成功先生】 AVL树

AVL树这里直接使用键值对,即 KV模型,使用键值对是为了方便后面实现 set 和 map。AVL树节点的定义增加了一个指向父节点的指针,变成了三叉链结构,并且每个节点都增加了一个平衡因子(右子树高度 -左子树高度的值),平衡因子的初始化设置为0即可// 右树高减去左树高int _bf;

2023-06-22 16:22:49 42

原创 【为成功先生】 C++ set和map的使用

使用平衡二叉搜索树(红黑树)作为其底层。set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2023-06-21 17:59:37 40

原创 【为成功先生】C++ 二叉搜索树

删除节点的两种情况 1、如果要删除的Node的左为空,则他的父亲指向Node的右, 如果要删除的Node的右为空,则他的父亲指向Node的左。 最后删除自己 叶子结点也适用 2、 如果要删除的Node的左右都不为空,不能直接删除,使用替代法 可以找左子树的最大的结点(key)或者找右子树的最小的结点(key)去替代要删除的Node 最右边的节点 最左边的结点

2023-05-29 22:17:07 40

原创 [为成功先生] C++ 多态

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。virtual 和 三个相同函数名相同参数类型、数量相同返回类型相同具体细节:1、子类虚函数可以不加virtual (建议:父类子类虚函数都加上)2、协变:三同中,返回值可以不同,但是要求返回值必须是一个父子类关系的指针或者引用是否满足多态:满足多态:跟调用对象的类型无关,跟指向对象有关,指向哪个对象调用的就是他的虚函数。

2023-05-19 01:32:03 60

原创 C++ 反向迭代器

反向迭代器可以用来反向遍历容器,正向迭代器对象构造函数源码中的反向迭代器设计较为复杂,涉及 萃取 等操作,为了方便学习,这里实现的是简易版本库中的反向迭代器中,rbegin()指向最后一个有效元素的下一个位置,rend()指向第一个有效元素。

2023-05-18 09:45:00 124

原创 【为成功先生】C++ 继承

要让一个子类继承父类,需要在子类的类的类名后加上冒号,并跟上继承方式和父类类名即可根据继承方式把基类(父类)的成员变成派生类(子类)“对应”(通过下面的方式)访问限定符内。基类的成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public > protected>private。常用的是public。一般不建议设计出多继承,一定不要设计出菱形继承,否则在复杂度及性能上都有问题。继承与组合public 继承是一种 is-a 的关系。也就是说每个派生类对象都是一个基类对象。

2023-05-17 07:45:00 107

原创 C++ 模板进阶

优点1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性缺陷1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2023-05-16 09:30:00 26

原创 C++ 仿函数 && 优先级队列

仿函数 :函数对象可以像函数一样去使用。

2023-05-15 10:30:00 33

原创 C++ 容器适配器

string/vector/list 容器容器适配器优先级队列dequeue 双端队列 可以用于实现栈和队列缺点1 大量的频繁operator[]的效率低2 迭代器的遍历相对复杂,效率也有一些影响容器适配器 都不支持迭代器遍历,因为他们通常都包含一些特殊性质1.stack在C++中是一种容器适配器,具有后进先出的操作,其删除只能从容器的一端进行元素的插入与提取操作。

2023-05-14 08:00:00 146

原创 C++ 模拟实现 list

优点下标的随机访问尾插尾删效率高CPU高速缓存命中率高,因为物理空间连续缺点随机插入或删除数据效率低扩容有消耗 ,还会存在一定的空间浪费。

2023-05-13 07:15:00 29

原创 C++ vector之模拟实现

【代码】C++ vector之模拟实现。

2023-05-12 20:58:26 42

原创 C++ STL之vector使用

vector是一个动态增长的数组,使用的是同一块连续的空间,当空间不足就会涉及到空间增容优点:支持下标的随机访问。缺点:数据过多时头插和中部插入的效率很低。

2023-05-11 22:50:44 69

原创 C++ 之模拟实现string

如果不实现,默认的拷贝,只会复制_str的地址,析构时会释放两次相同的空间,程序会崩溃。实现 coutstr 的形式。以下都是放在public限定符下的。

2023-05-08 08:15:00 38

原创 C++ STL之 string类用法

0 比较字符串中第一个不匹配字符的值更大,或者所有比较字符都匹配但比较字符串更长。find_last_not_of 从字符串末尾查找不匹配的字符(公共成员函数)find_first_not_of 查找字符串中不存在的字符(公共成员函数)find_last_of 从字符串末尾开始查找字符(公共成员函数)实际上返回的就是string类中的内容的地址,也就是字符串的地址。

2023-05-07 15:21:53 457

原创 C++ 模板初阶

类模板+ 类域访问。

2023-05-06 06:30:00 32

原创 C++ 内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会class Apublic::_a(a)~A()private:int _a;int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;

2023-05-05 01:00:00 55

原创 类与对象实操 日期类

【代码】类与对象实操 日期类。

2023-05-04 01:00:00 27

原创 C++ 类与对象 (三)

不属于任何类,但需要在类的内部声明,声明时需要加。

2023-05-03 17:48:12 71

原创 C++ 类与对象(二)

1.初始化和清理: 构造函数:主要完成初始化工作。 析构函数:主要完成清理工作。2.拷贝赋值: 拷贝构造:使用同类对象初始化创建对象。 赋值重载:把对象赋值给另一个对象。3.取地址重载: 普通对象的取地址。 const对象的取地址。 (这两个很少会自己去实现)

2023-04-22 00:48:00 43

原创 C++ 类与对象(一)

在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。struct/class 类名:{访问控制限定符:类名(形参表):初始化表{...}//构造函数~类名(void){...} //析构函数返回类型 函数名(形参表){} //成员函数数据类型 变量名;//成员变量。

2023-04-21 00:53:28 48

原创 C++ 基础

C++ 是 C语言 的超集,是一门在 C语言 基础上发展起来的语言。所以C语言的语法在C++都通用,所以这里就不会介绍C语言与C++相同的语法了。写博客是为了记录下学习C++的而做的笔记。防止自己遗忘。如果你正在学习C++,而刚好又是很无聊(上课、一个人走在路上)的时候,你可以试着看一看。在学C++的路上难免会遗忘一些知识,所以我写下博客记上笔记,只会减缓遗忘。

2023-04-20 00:49:49 50

二维前缀和与差分数组的图片

图片

2024-04-12

一维前缀和与差分数组的图片

图片

2024-04-10

AVL树 本博客使用的图片

AVL树 本博客使用的图片

2023-07-13

C++ 红黑树 在本博客使用的图片

C++ 红黑树 在本博客使用的图片

2023-07-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除