
C++笔记
文章平均质量分 87
C++学习笔记
大筒木老辈子
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++笔记---位图
位图(Bitmap)是一种基于位操作的数据结构,用于表示一组元素的集合信息。它通常是一个仅包含0和1的数组,每个元素对应一个二进制位,若该元素存在,则对应的位为1;若不存在,则为0。位图的这种表示方式使得它能够在存储上以极高的空间效率来管理大规模数据。位图特别适用于需要频繁查询和更新的场景,如数据库索引、图像处理和网络协议等。简单来说,就是一个采用直接定址法的哈希表,只不过一个bit位映射一个数。底层通常是一个存储整形的数组或vector,将其中的整形数据连起来看作一个存储bit位的数组。原创 2024-10-26 15:52:44 · 956 阅读 · 8 评论 -
C++笔记---包装器
C++中的包装器是一种设计模式,用于将一个复杂或底层的接口进行封装,以便提供一个更简洁、易用的接口。包装器可以包装任何类型的可调用实体,如函数,成员函数,函数指针,仿函数对象,lambda表达式等。包装器在资源管理、接口封装、类型安全等方面有广泛应用。在实际编程中,包装器可以用于回调机制、事件处理、异步编程等场景。它们提供了灵活的函数调用机制,使得代码更加模块化和可重用。综上所述,C++包装器是提升代码可读性、可维护性和性能的有力工具。原创 2024-11-10 17:22:48 · 842 阅读 · 19 评论 -
C++笔记---右值引用
左值(lvalue)左值是指可以放在赋值号(=)左边的表达式,它代表一个可以被引用的内存位置。左值通常是变量名、数组元素、解引用的指针等。左值具有持久性,可以被多次引用和修改。右值(rvalue)右值是指只能放在赋值号(=)右边的表达式,它代表一个临时的值,通常是字面量、函数返回值、表达式的结果等。右值不具有持久性,一旦被使用就会被丢弃。左值与右值的核心区别就在于能否取地址。原创 2024-10-27 14:32:06 · 1233 阅读 · 10 评论 -
C++笔记---封装unordered_set和unordered_map
unordered_set/unordered_map底层为哈希表,相比于底层为红黑树的set/map来说,数据无序但查找插入都更高效。要自己实现unordered_set/unordered_map,重点在于底层哈希表的实现,难点在于各个结构之间的相互嵌套,参数类型的传值,在自己实现的过程中一定会出现很多问题的。而且报出来的错误会让你觉得牛头不对马嘴,例如:这是由于end()后面加上了const而发生的报错,但感觉怎么想二者之间都没关系,真给我搞红温了。原创 2024-10-23 18:09:55 · 1250 阅读 · 0 评论 -
C++笔记---lambda表达式
Lambda表达式是C++11引入的一种便捷的匿名函数定义机制。lambda 表达式本质是一个匿名函数对象,跟普通函数不同的是他可以定义在函数内部。lambda 表达式语法使用层而言没有类型,所以我们一般是用auto或者模板参数定义的对象去接收 lambda 对象。原创 2024-11-10 17:23:09 · 1282 阅读 · 12 评论 -
C++笔记---set和map
关于set的使用,将其当作key搜索场景的红黑树来使用即可。类型参数分别为:key的类型,比较器(通过仿函数实现,默认为小于比较,中序遍历得到升序序列),内存池。一般来说,后两个参数有缺省值,的使用频率较低,我们在日常使用的过程中只需要传入第一个参数即可。,关于map的使用,将其当作key/value搜索场景的红黑树来使用即可。类型参数分别为:key的类型,value的类型,比较器(通过仿函数实现,默认为小于比较,中序遍历得到升序序列),内存池。原创 2024-09-23 17:58:43 · 1096 阅读 · 21 评论 -
C++笔记---异常
异常通常是指在程序运行中动态出现的非正常情况,这些情况往往是可以预见并可以在不停止程序的情况下动态地进行处理的。错误通常是指那些会导致程序终止的,无法动态处理的非正常情况。例如,越界访问、栈溢出、语法错误等等。错误往往无法预见,需要程序员进行调试来发现出错的原因。原创 2024-11-12 17:28:42 · 1065 阅读 · 18 评论 -
C++笔记---智能指针
内存泄露是指程序在运行过程中动态分配的内存未能被正确释放或回收,导致这部分内存无法供其他程序或同一程序的其他部分使用。随着时间的推移,未被释放的内存会被不断累积,可能导致系统可用内存减少,进而使程序运行变慢、响应时间增加,甚至可能引发系统崩溃或资源耗尽。原创 2024-11-12 17:28:22 · 1056 阅读 · 8 评论 -
C++笔记---AVL树的插入删除
AVL树是一颗高度平衡搜索二叉树,通过控制高度差去控制平衡。AVL树得名于它的发明者G. M.原创 2024-09-29 14:31:43 · 986 阅读 · 26 评论 -
C++笔记---可变参数模板
可变参数模板是指模板的类型参数列表的的。C++11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数目的参数被称为参数包,存在两种参数包:模板参数包:表示零或多个模板参数。函数参数包:表示零或多个函数参数。参数包的加入使得我们可以更加方便地设计出参数个数可变的函数,就比如模拟实现printf。但C语言由于不支持模板,所以实现printf的方式十分复杂,查了我也没看明白。原创 2024-10-31 18:04:13 · 1215 阅读 · 23 评论 -
C++笔记---红黑树的插入删除
红黑树是一棵二叉搜索树,他的每个结点增加一个存储位来表示结点的颜色,可以是红色或者黑色。通过对任何一条从根到叶子的路径上各个结点的颜色进行约束,红黑树确保对于任意一个结点,没有一条到NULL结点的路径会比其他到NULL结点的路径长度的两倍以上,因而是接近平衡的。原创 2024-10-12 19:55:40 · 1432 阅读 · 29 评论 -
C++笔记---布隆过滤器
布隆过滤器(Bloom Filter)是一种空间效率高的概率型数据结构,用于判断一个元素是否在一个集合中。如果判断的结果是不存在,那么该元素一定不存在,如果判断的结果是存在,该元素也有可能不存在。也就是说,布隆过滤器可以过滤掉。布隆过滤器的思路就是把key先映射转成哈希整型值,然后按照与位图相同的方式用bit位进行标记,但由于多个key可能映射出相同的整型值,所以只用一个bit位进行标记的话冲突概率较大。原创 2024-10-31 18:04:26 · 919 阅读 · 13 评论 -
C++笔记---哈希表
哈希(hash)又称散列,是一种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希函数把关键字Key跟存储位置建立一个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找。STL中的unordered_set和unordered_map的底层就是对哈希表的封装。图书馆中的书就类似于使用哈希的方式进行存储的,当你在图书馆找书时,你通过想找的书的类型(key)判断出其所在的分区(哈希函数计算出地址),就可以很快地将搜索范围锁定到一块区域。原创 2024-10-23 16:40:54 · 1329 阅读 · 11 评论 -
C++笔记---继承(下)
要实现无法被继承的类有两种方式:C++98及其之前:将父类的构造函数设置为private成员。C++11及其之后:使用final关键字修饰父类。将构造函数设置为private是因为:子类的构成必须调用父类的构造函数,但是父类的构成函数私有化以后,子类看不见就不能调用了,那么子类就无法实例化出对象。原创 2024-09-15 13:13:31 · 1275 阅读 · 16 评论 -
C++笔记---vector
vector其实就是我们所熟知的顺序表,但其是作为STL中的一个类模板而存在。也就是说,vector是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型,或是STL中的其他容器。vector的使用方式与string基本相似,但其接口相对于string来说要简洁地多,也与之后会介绍地各种STL的类模板跟为接近。具体以为准,本文为该文档的一个简单总结与标注。原创 2024-09-08 12:23:26 · 958 阅读 · 11 评论 -
C++笔记---类和对象(下)
1. 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方,但并不完全正确。2. 引用成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。3. 尽量使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显式在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。原创 2024-08-20 17:54:17 · 938 阅读 · 19 评论 -
C++笔记---引用
引用就是为一个变量取一个别名,无论是通过原名还是别名进行访问,访问到的都是同一块空间。从语法上来讲,引用没有开辟额外的空间,逻辑上类似于(引用类型和引用对象不对应的情况,详见“”部分)。类型& 引用别名 = 引用对象;C++中为了避免引入太多的运算符,会复用C语言的一些符号,比如前面的>>,这里引用也和取地址使用了同一个符号&,大家注意使用方法角度区分就可以。这里的a,b,c,d共用一块空间,所以输出的结果是4个1。原创 2024-07-27 00:15:00 · 1266 阅读 · 23 评论 -
C++笔记---string类(不完全实现)
【代码】C++笔记---string类(不完全实现)原创 2024-09-04 17:24:09 · 261 阅读 · 23 评论 -
C++笔记---stack和queue
queue---队列,是一种“先进先出,后进后出”的数据结构。此处的queue是STL库中定义的一个类模板,用于实例化出存储各种类型数据的队列。判断队列是否为空(空true/非空false)返回队列中的数据个数T& front();返回队头元素(目前最早进最先出的元素)T& back();返回队尾元素(目前最后进最后出的元素)入队列(到队尾)void pop();出队列(删除队头元素)交换两个队列的内容。原创 2024-09-11 17:40:16 · 865 阅读 · 6 评论 -
C++笔记---类和对象(上)
public:// 成员函数perror("malloc申请空间失败");return;top = 0;// ...扩容int Top()private:// 成员变量int* array;size_t top;// 分号不能省略class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省 略。类和C语言中的结构体类似,类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数/类函数。原创 2024-07-29 17:45:32 · 1107 阅读 · 13 评论 -
C++笔记---模板进阶
【优点】1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2. 增强了代码的灵活性【缺陷】1. 模板会导致代码膨胀问题,也会导致编译时间变长2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-09-13 19:50:00 · 1102 阅读 · 11 评论 -
C++笔记---日期类实现
【代码】C++笔记---日期类实现。原创 2024-08-20 17:08:26 · 254 阅读 · 16 评论 -
C++笔记---list
list其实就是就是我们所熟知的链表(双向循环带头结点),但其是作为STL中的一个类模板而存在。也就是说,list是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型,或是STL中的其他容器。除了底层的实现不同以外,用法与vector基本相同,但不支持随机访问,以及与随机访问有关的接口。具体以为准,本文为该文档的一个简单总结与标注。原创 2024-09-10 19:58:36 · 1616 阅读 · 12 评论 -
C++笔记---模板初阶
模板是什么模板就是一种通用的模型,只要我们给出模板,编译器就可以自动帮助我们自动生成函数或类。模板又分为函数模板和类模板。模板的意义这些函数的函数体完全一样,而我们写了这么多个仅仅是因为参数的类型不同,如果有新的类型出现,我们还需要继续增添这样类似的函数。这么简单的工作又何必让我们亲自动手呢?祖师爷Bjarne Stroustrup说要方便,于是便有了模板。原创 2024-09-01 10:40:32 · 515 阅读 · 2 评论 -
C++笔记---命名空间(namespace)
在命名空间中可以定义变量,结构体,函数,甚至是其他命名空间。C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/ 类型出处(声明或定义)的逻辑,有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不影响变量生命周期。注意:namespace只能定义在全局,当然它还可以嵌套定义。项目工程中多文件中定义的同名namespace会认为是⼀个namespace,不会冲突。原创 2024-07-25 16:02:27 · 917 阅读 · 23 评论 -
C++笔记---内存管理
共同点都是从堆上申请空间,并且需要用户手动释放。不同点1. malloc和free是函数,new和delete是操作符;2. malloc申请的空间不会初始化,new可以初始化;3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可, 如果是多个对象,[]中指定对象个数即可;4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型;原创 2024-08-24 15:41:44 · 795 阅读 · 12 评论 -
C++笔记---类和对象(中)
上面的Date类的成员变量就全部是内置类型,而下面的用栈来实现的队列则包含了自定义类型,即栈类。原创 2024-08-04 17:15:13 · 1184 阅读 · 12 评论 -
C++笔记---string类(简单地使用)
string类是C++标准库中给出的一种类类型,其目的是为了代替C语言中的字符串。C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。string类通过运算符重载,基本兼容了C语言中字符串的特性,字符串也可隐式类型转换为string类。原创 2024-09-04 17:24:06 · 1096 阅读 · 3 评论 -
C++笔记---多态
具体来说,动态的多态发生在继承体系中,父类与子类或统一父类的各子类之间,是在调用函数时发生不同的行为的现象。比如Student继承了Person。Person对象买票全价,Student对象优惠买票。public:cout原创 2024-09-16 13:28:35 · 1082 阅读 · 4 评论 -
C++笔记---继承(上)
class 子类名 : 访问限定符 父类名// 拓展内容通常来说,父类和子类具有类别上的包含关系。例如,老师和同学不仅具有人的基本特点,还在人的基础之上有了自己的拓展,而老师和同学都属于人。我们在用C++进行描述的时候,就可以将老师和同学设计成人的子类:public:// 进⼊校园/图书馆/实验室刷⼆维码等⾝份认证protected:string _name = "张三";原创 2024-09-13 19:50:13 · 1140 阅读 · 11 评论 -
C++笔记---缺省参数和函数重载
C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者参数类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。// 1、参数类型不同// 2、参数个数不同void f()// 3、参数类型顺序不同由于构成函数重载的同名函数的参数有所不同,编译器就可以根据调用时传入的参数来确定调用的具体是哪个函数。原创 2024-07-25 16:52:12 · 704 阅读 · 12 评论 -
C++笔记---二叉搜索树
K _key;:_key(key){}public://强制生成默认构造//拷贝构造//析构~BSTree();原创 2024-09-17 13:25:03 · 1411 阅读 · 12 评论