
C++
文章平均质量分 75
C++从入门到现在
风掣长空
这个作者很懒,什么都没留下…
展开
-
C++11——智能指针
在 C++中,智能指针如 unique_ptr 和 shared_ptr 默认使用 delete 或 delete[] 来释放内存,在一些场景下,delete 可能不适用,所以要定制删除器,lambda 表达式很适合作为删除器。这段代码出现了循环引用,会造成内存泄漏的问题,_next 指向 node2,_prev 指向 node1,谁也不先释放,引用计数也不为 0, 造成循环引用的现象,出现内存泄漏。是的,引用计数的加减是加锁保护的,但是指向的资源不是线程安全的。shared_ptr 的循环引用问题。原创 2024-11-20 16:39:25 · 765 阅读 · 0 评论 -
C++11——异常
一般情况下,抛出的异常都是派生类对象,异常捕获的是基类对象,派生类继承了基类,这样 catch 捕获的时候,只需要捕获基类对象就可以了public:, _id(id){}protected:int _id;return str;原创 2024-11-19 20:46:35 · 1071 阅读 · 0 评论 -
C++11————线程库
在 c++11 之前,涉及到多线程问题,都是和平台相关的,比如 windows 和 linux 下各自有自己的接口,这使得代码的可移植性比较差。在 c++11 中引入了线程库,使得 c++在编程时不需要依赖第三方库了函数名功能thread()构造一个线程对象,没有关联任何线程函数,即没有启动任何线程构造一个线程对象,并关联线程函数 fn,args1,args2, ... 为线程函数的参数get_id()获取线程 idjoinable()原创 2024-11-17 21:39:39 · 1683 阅读 · 0 评论 -
C++11——包装器和绑定
也就是说placeholders::_1永远表示传的第一个参数,placeholders::_2表示传的第二个参数,而对于fx函数来说,按照传参顺序,placeholders::_2表示a,placeholders::_1表示b,这样就实现了参数顺序的调换;std::bind定义在头文件里,是一个函数模板,他可以接受一个可调用对象,然后生成一个新的可调用对象,新的可调用对象的参数顺序或者参数个数可以发生改变,以此来适应原对象的参数列表,如果包装成员函数指针,需要注意哪些?原创 2024-08-09 20:54:41 · 447 阅读 · 0 评论 -
C++11新特性
如果你没有实现移动赋值重载函数,且没有实现拷贝构造,赋值重载和析构函数,那么编译器会默认生成移动赋值,默认生成的移动赋值函数,对对内置类型,会按字节拷贝,对自定义类型成员,要看这个成员是否实现移动赋值,如果实现了移动赋值就调用移动赋值,如果没有实现就调用拷贝赋值。返回值类型,函数可以自动推导,如果没有返回值,可以省略,如果有返回值,返回值明确的情况下,也可以省略,所以我们常见的写法都是省略了;左值是一个表示数据的表达式,通俗来说,可以被取地址的叫做左值,左值引用就是给左值取别名,原创 2024-08-09 20:53:51 · 970 阅读 · 0 评论 -
unordered_map和unordered_set的封装
【代码】unordered_map和unordered_set的封装。原创 2024-08-03 22:39:27 · 465 阅读 · 0 评论 -
C++——哈希结构
1.unordered_map是储存键值对的关联式容器,其允许通过key快速查找到对应的value,和map非常相似,但是底层实现完全不同。2.unoredered_map没有对进行排序,而是映射一个对象,其内容与其键相关联,键和映射值的类型可能不同。构造一种储存结构,通过某种函数使元素的储存位置与他的关键码建立一一映射的关系,那么在查找该元素的时候很快就能找到。就是用我们插入的数据模上哈希表的长度,得出的余数,就是我们得到的插入位置的下标;原创 2024-08-03 22:38:40 · 929 阅读 · 0 评论 -
map和set的封装
map和set的底层是红黑树,我们可以对红黑树进行一下改造,同时满足map和set的需求。原创 2024-07-30 14:25:22 · 331 阅读 · 0 评论 -
map和set的底层结构——红黑树
RED,BLACK, _kv(kv){}红黑树多了储存颜色的功能;而且红黑树插入节点是默认插入红色的节点,因为如果插入黑色节点,必定破坏规则4,而插入红节点,可能破坏规则三,可能出现两个连续的红色节点,但是可以修改,也有可能插入红色节点,刚好满足条件,所以我们选择插入默认是红色的节点;原创 2024-07-30 14:24:38 · 613 阅读 · 0 评论 -
二叉搜索树——AVL树
_bf(0){}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。原创 2024-07-26 22:53:16 · 456 阅读 · 0 评论 -
c++——map和set
2.在map中,键值key通常用于排序和唯一的标识元素,而值value中存储于此键值key相关联的内容,key和value的类型可能不同,并且在map内部,key与value通过成员类型value_type绑定在一起,取名为pair。关联式容器存储的也是数据,与序列式容器不同的是,里面存储的是结构的键值对,在数据检索时比序列式容器更高效。insert可以插入数据,当插入已有元素的时候,他会不执行插入操作,也就是set可以去重,默认的set是按升序排序,可以去重的。原创 2024-07-24 19:08:16 · 577 阅读 · 0 评论 -
C++——二叉搜索树的实现
二叉搜索树又叫做二叉排序树,他或者是一棵空树,或者具有以下性质:若他的左子树不为空,则左子树的所有节点的值都小于根节点的值,若他的右子树不为空,则右子树的所有节点的值都大于根节点的值,他的左右子树也分别为二叉搜索树;原创 2024-07-13 12:15:34 · 453 阅读 · 0 评论 -
c++多态的定义和原理
多态的概念:多种形态去完成同一个行为,会出现不同的状态,叫做多态;在虚函数的后面写上 =0 ,则这个函数为纯虚函数,包含纯虚函数的类称为抽象类(也叫做接口类),抽象类不能实例化出对象,派生类继承后也不能实例化出对象,只有重写虚函数,派生类才能实例化出对象,纯虚函数规范了派生类必须重写,另外纯虚函数更体现了接口继承,class Carpublic:public:cout原创 2024-07-11 18:06:38 · 1027 阅读 · 4 评论 -
菱形继承和菱形虚拟继承
c++具有多继承的特性,那么菱形继承就是多继承的一种特殊情况,但是菱形继承会出现一些问题,比如数据冗余和二义性;那么怎么解决这个问题呢?菱形虚拟继承。原创 2024-07-04 18:41:27 · 226 阅读 · 1 评论 -
C++中的继承
继承( inheritance)机制是面向对象程序设计使代码可以复用的重要手段,他允许在保留原有类特性的基础上进行扩展,增加功能,产生新的了,类,叫做派生类。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了//Student和Teacher复用了Person的成员。下面我们使用监视窗口查看Student和Teacher对象,可//以看到变量的复用。调用Print可以看到成员函数的复用。原创 2024-06-23 23:52:11 · 762 阅读 · 0 评论 -
C++模板进阶
模板参数分为类型参数和非类型参数;类型参数:出现在模板参数类型中,跟在class 或 typename 后面的参数非类型参数:就是用一个常量作为类(函数)模板的参数,在类(函数)模板中可以将该参数作为常量来使用;这里面的N可以当作常量使用,注意,这里只能是用size_t类型作为非类型模板参数,不能用浮点数,类对象等,因为在C++20之前,这些还没有设计出来,只有size_t可以用;原创 2024-06-19 16:51:33 · 803 阅读 · 0 评论 -
反向迭代器的实现
对于带有迭代器的容器,有正向迭代器,也有反向迭代器,而正向迭代器和反向迭代器比较相似,所以我们可以写一个反向迭代器的模板,给编译器,从传不同的容器的正向迭代器,实例化出对应的反向迭代器,也就是对正向迭代器进行封装,实现反向迭代器,当我i们返回节点时,先 -- 解引用,这样得到的是前一个节点的值,这样就可以解决哨兵位没有有效值的问题了;rbegin在end处,也就是哨兵位的地方,rend在begin处,这样写是为了和正向迭代器对称;//返回当前节点的上一个节点的值。这是以list为例,实现的反向迭代器;原创 2024-06-16 20:20:57 · 182 阅读 · 0 评论 -
satck和queue以及priority_queue
队列是一种容器适配器,具有先进先出的特点,标准容器deque和list可以作为底层容器构建queue,为什么不用vector呢?因为vectoe进行头删时比较麻烦,代价比较大,优先队列是一种容器适配器,按照降序排序,不管你是怎么插入的,他的第一个元素总是他所包含的元素中最大的那一个,优先队列底层类似于堆,默认按照大堆实现,排降序;标准容器vector 和deque可以作为底层实现容器,默认情况下使用vector作为底层实现容器。原创 2024-06-16 15:27:57 · 729 阅读 · 0 评论 -
string的模拟实现
【代码】string的模拟实现。原创 2024-05-11 15:54:15 · 134 阅读 · 0 评论 -
C++——string类的使用
在 c plus plus 这个网站上可以查到相关的信息,(1)是无参构造函数(也是默认构造),就是一个空字符串(2)是一个拷贝构造,传入一个参数构造字符串(3)是一个有参构造,参数有点复杂,他有一个字符串,在字符串的pos位置,取len个字符,这个len有缺省值,len=npos,npos是一个无符号整型的-1,表示此类型的最大值,也就是无符号整形中最大的值,假设我们不给len传参,就是从pos位置,取到字符串的末尾,然后赋值给s3;原创 2024-04-28 18:51:58 · 902 阅读 · 2 评论 -
C++练级之路——模板初阶
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)原创 2024-04-23 23:30:16 · 329 阅读 · 0 评论 -
C++内存管理
new的原理:调用operator new申请空间,然后在申请的空间调用构造函数,完成对象的构造delete的原理:在空间上执行析构函数,完成对象中资源的清理工作 ,然后调用operator delete函数释放对象的空间new T[]的原理:调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请,然后在申请的空间上执行N次构造函数;原创 2024-04-22 21:30:50 · 687 阅读 · 0 评论 -
C++练级之路——类和对象(下)
static成员变量不在类中创建,而是在静态区,当然static也不能给缺省值,因为缺省值是要进初始化列表的,而static不在初始化列表中进行初始化,所以不能给缺省值,static属于整个类域,在整个类中都可以访问,如果static定义的是public,那么在类外也可以访问;4.初始化列表,不管你写不写,每个成员变量都会先走一遍,自定义类型会调用默认构造(没有默认构造就报错)内置类型有缺省值就用缺省值,没有缺省值,不确定,C++没有规定,要看编译器,先走初始化列表,再走函数题。原创 2024-04-19 11:02:02 · 773 阅读 · 0 评论 -
C++练级之路——类和对象(中二)
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也是具有其返回值类型,函数名字以及参数列表,其返回值类型和参数列表与普通的函数类似。函数名字为:关键字operator后面接需要重载的运算符符号;函数原型:返回值类型 operator操作符(参数列表)。注意:1.不能通过链接其他符号来创建新的操作符:比如 operator@;2.重载操作符必须有一个类类型参数;3.用于内置类型的运算符,其含义不能改变,例如:内置类型的+,不能改变其含义;原创 2024-04-17 18:17:10 · 1153 阅读 · 0 评论 -
C++练级之路——类和对象(中)
我们创建一个类,如果我们什么都不写,类会自动生成六个默认成员函数;接下来一个一个了解;原创 2024-04-11 09:35:31 · 481 阅读 · 2 评论 -
C++练级之路——C++入门
缺省参数是声明或定义函数时为函数的参数指定一个缺省值,在调用这个函数时,如果实参没有指定的函数值,就采用该缺省参数。第一个fun()函数,没有指定实参的值,则默认使用形参的缺省值,第二个fun()函数,实参是20,那么就用实参的值。原创 2024-03-31 21:13:19 · 914 阅读 · 1 评论 -
C++练级之路——类和对象(上)
class为定义的关键字,{ }内是类的主体,注意后面的;不要忘了类体中的内容成为类的成员,类中的变量为成员变量或类的属性,类中的函数为成员函数或类的方法,类的两种定义方式:1、声明和定义都放在类中, 需注意成员函数如果在类中定义,编译器可能会将其当成内联函数处理;2、声明和定义分离,在头文件中声明,在源文件中定义,一般情况下,都采用第二种方式;原创 2024-04-08 22:03:22 · 886 阅读 · 2 评论