c++笔记
文章平均质量分 96
记录学习c++的笔记
dong132697
还在学习中,文章中的完整代码可以私聊我,无偿发。
展开
-
c++并查集
在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(union-find set)。例如某公司今年校招共招10个人,北京招4人,河南招3人,西安招3人,10个人来自不同的学校,刚开始互相都不认识,所以每个人都是一个独立的小团体,我们给这些人进行编号:{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};原创 2024-04-27 23:03:05 · 947 阅读 · 0 评论 -
c++智能指针
下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析Func函数中的问题。下面的代码中会因为异常的抛出而造成内存泄漏。例如如果在p2的new中抛出异常,那么会直接跳到异常的处理catch的代码块中,这样就没有执行Func函数中的delete p1来释放p1的内存了。而如果在div()函数中抛出异常,那么不会执行delete p1和delete p2,这样就造成了p1和p2的内存泄漏。throw "除0错误";原创 2024-01-12 19:14:10 · 1518 阅读 · 0 评论 -
c++异常
终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。原创 2024-01-11 14:30:02 · 735 阅读 · 0 评论 -
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年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2024-01-06 20:06:52 · 1052 阅读 · 0 评论 -
c++内存池项目
下面我们来实现项目的ThreadCache部分。我们将ThreadCache类的成员函数的声明和定义分别写到ThreadCache.h和ThreadCache.cc文件中。然后我们在Common.h文件中实现一些共用的类或函数。我们实现ThreadCache的初步思想和定长内存池类似,只不过内存池中申请的内存块不再是定长的,而是有可能为1、2、4、8、9、10…等字节的内存块,所以这些申请的内存块释放时,我们就不能挂载到同一个链表上,所以我们采用哈希桶类似的数据结构来管理这些大小不一的被释放的内存块。原创 2023-12-21 12:24:56 · 973 阅读 · 0 评论 -
c++-定长内存池
我们知道申请内存使用的是malloc,malloc其实就是一个通用的申请函数,什么场景下都可以用,但是什么场景下都可以用就意味着什么场景下都不会有很高的性能,下面我们来设计一个定长内存池。定长内存池的特点就是每次都申请固定大小的内存,这样做的话就可以使性能达到极致,并且不需要考虑内存碎片等问题。我们在定长内存池类中创建一个 _memory来指向申请的大块内存。然后设置一个 _freeList指针来存还回来的内存块。再设置一个 _remainBytes来记录申请的大块内存的剩余空间。原创 2023-12-07 15:46:22 · 995 阅读 · 0 评论 -
c++-哈希
在学习哈希之前,我们先来学习四个c++11中新添加的两个容器。我们知道在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2Nlog_2 Nlog2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。原创 2023-11-13 17:24:42 · 105 阅读 · 0 评论 -
c++-红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。所以红黑树不是严格平衡的,只是近似平衡。下面我们来使用代码定义红黑树的结点。红黑树的结点定义和AVL树结点的定义类似,只不过AVL树中使用平衡因子来严格控制平衡,而红黑树中使用颜色来控制本身近似为平衡树。思考:在结点的定义中,为什么要将结点的默认颜色给成红色的?原创 2023-11-06 19:41:13 · 287 阅读 · 0 评论 -
c++-AVL树
前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。原创 2023-11-02 21:12:36 · 235 阅读 · 0 评论 -
c++-set和map
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。原创 2023-10-31 15:25:02 · 88 阅读 · 0 评论 -
c++-二叉树进阶
二叉搜索树(BST,Binary Search Tree),又称二叉排序树或二叉查找树,它或者是一棵空树,或者是具有以下性质的二叉树:(1). 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值。(2). 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值。(3). 它的左右子树也分别为二叉搜索树。原创 2023-10-30 12:05:58 · 425 阅读 · 0 评论 -
c++中的多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。例如买票,学生买票是半价,成年人买票是全价,老人和小孩买票是半价。多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。在继承中要构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数。2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2023-10-24 22:29:11 · 220 阅读 · 0 评论 -
c++中的继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。下面我们看到的Person是父类,也称作基类。Student是子类,也称作派生类。1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。原创 2023-10-21 15:12:10 · 150 阅读 · 0 评论 -
c++模板进阶
模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。下面的代码中在Array类中,我们使用N来定义 _a数组的长度,但是当我们想让存不同类型的Array类中的 _a数组的长度不一样时,我们就需要使用非类型模板参数了。下面为非类型模板参数。需要注意的是**非类型模板参数只能为整型常量。原创 2023-10-19 18:09:47 · 259 阅读 · 0 评论 -
c++-stack和queue
1.stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2.stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3.stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。原创 2023-10-19 14:49:06 · 553 阅读 · 0 评论 -
c++-list
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2023-10-09 21:55:57 · 901 阅读 · 0 评论 -
c++-vector
vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。原创 2023-10-03 22:42:24 · 360 阅读 · 0 评论 -
c++-string
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本(1). 原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。HP 版本–所有STL实现版本的始祖。(2). P. J. 版本。原创 2023-09-26 22:54:28 · 192 阅读 · 0 评论 -
c++模板初阶
在学习了前面的c++重载之后,我们写一个Swap函数用来交换不同类型的数据时,可以使用函数重载,然后让每个Swap函数的形参不同。x = y;y = tmp;x = y;y = tmp;x = y;y = tmp;int a2 = 2;return 0;1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。2. 代码的可维护性比较低,一个出错可能所有的重载均出错。原创 2023-09-20 11:30:34 · 248 阅读 · 0 评论 -
C/C++内存管理
先来看一下下面的题复习一下c语言中的内存分布。选择题:选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里?____ staticGlobalVar在哪里?____staticVar在哪里?____ localVar在哪里?____num1 在哪里?____char2在哪里?____ *char2在哪里?___pChar3在哪里?____ *pChar3在哪里?____ptr1在哪里?原创 2023-09-19 22:57:08 · 263 阅读 · 0 评论 -
为什么c++支持函数重载,c语言不支持
为什么c++可以支持函数重载,而c语言不支持,这其实是因为c++和c在链接时对函数名修饰规则的不同。经过上面的分析就理解了C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办法区分。这就是c++项目引用c语言实现的静态库。原创 2023-09-17 15:53:18 · 412 阅读 · 0 评论 -
c++类与对象(下)
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然我们之前写的构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。int _month;int _day;原创 2023-09-15 16:02:22 · 108 阅读 · 1 评论 -
c++类与对象(中)
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。我们回想在前面实现的队列,栈,单链表等,在使用这些数据结构时,都要先调用对应的Init()函数,即初始化函数,如果我们忘记调用,则这些数据结构里面存的就会是随机值。但是我们也不能保证每次使用这些数据结构时都能先调用初始化函数。所以在c++中就增加了构造函数这一个特殊的成员函数。原创 2023-09-13 22:59:13 · 147 阅读 · 0 评论 -
c++类与对象
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。虽然在c++中可以使用struct来定义类,但是在C++中更喜欢用class来代替。class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。//类体:由成员函数和成员变量组成 };原创 2023-09-08 16:11:22 · 203 阅读 · 0 评论 -
初识c++
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。原创 2023-09-04 23:00:13 · 3262 阅读 · 5 评论