C++
文章平均质量分 93
C++学习
sy'ty
学习
展开
-
【C++】IO流
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?1. 使用itoa()函数2. 使用sprintf()函数int main()return 0;运行结果:但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。原创 2023-10-24 17:27:41 · 106 阅读 · 0 评论 -
【C++】类型转换
在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2. 显式类型转化:需要用户自己处理缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。原创 2023-10-22 15:53:20 · 125 阅读 · 0 评论 -
【C++】特殊类实现
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可。 原因: 1. 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不能禁止拷贝了 2. 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写 反而还简单,而且如果定义了就不会防止成员函数内部原创 2023-10-21 16:57:32 · 321 阅读 · 0 评论 -
【C++】 智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.原创 2023-10-18 16:15:18 · 185 阅读 · 1 评论 -
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年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正原创 2023-10-16 14:14:04 · 120 阅读 · 0 评论 -
【哈希】——哈希的应用-位图/布隆过滤器+海量数据处理
(因为相同set会去重)比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。具体实现是求出x映射的位置,然后将1移到x的对应位置,其他位为0,0和任何数或都是原来的数,而1与x对应位置&之后都为1,这样就可以做到x对应位置为1。具体实现是求出x映射的位置,然后将1移到x的位置,然后进行取反,则其他位为1,而1与任何数与都为原来的数的值,x位置的数为0,相与之后x位置的值置为0。原创 2023-10-10 15:40:04 · 115 阅读 · 0 评论 -
【哈希】--unordered系列关联式容器
unordered_map在线文档说明unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。原创 2023-10-08 12:43:35 · 60 阅读 · 1 评论 -
红黑树封装map和set
由于map和set的valuetype不同,我们将红黑树的模板参数改为T,T代表的就是valuetype,来区别set和value的数据类型。原创 2023-09-17 11:03:16 · 49 阅读 · 0 评论 -
map和set的底层结构
/ 该节点的左孩子// 该节点的右孩子// 该节点的双亲int _bf;// 该节点的平衡因子:_kv(kv),_bf(0){}// 节点的颜色RED,BLACK// 红黑树节点的定义// 节点的左孩子// 节点的右孩子// 节点的双亲(红黑树需要旋转,为了实现简单给出该字段)// 节点的值// 节点的颜色,_kv(kv),_col(RED){}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?原创 2023-09-13 11:16:32 · 152 阅读 · 0 评论 -
map和set
set文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。原创 2023-08-16 15:27:58 · 56 阅读 · 0 评论 -
二叉树进阶
或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树。原创 2023-08-13 17:38:23 · 48 阅读 · 0 评论 -
C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。原创 2023-08-05 14:41:34 · 58 阅读 · 0 评论 -
C++中的继承
下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。原创 2023-08-01 14:24:33 · 138 阅读 · 0 评论 -
反向迭代器 + 模版进阶
【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2023-07-28 11:01:44 · 57 阅读 · 0 评论 -
vector
(constructor)构造函数声明接口说明vector()(重点)无参构造构造并初始化n个val(重点)拷贝构造使用迭代器进行初始化构造。原创 2023-07-20 22:06:14 · 139 阅读 · 0 评论 -
string类
就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了。原创 2023-07-18 10:53:48 · 45 阅读 · 0 评论 -
C++内存管理
/ new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数 A * p1 =(A *) malloc(sizeof(A));free(p1);delete p2;// 内置类型是几乎是一样的 int * p3 =(int *) malloc(sizeof(int));free(p3);delete p4;free(p5);原创 2023-05-27 10:28:56 · 156 阅读 · 0 评论 -
C++模板初阶
template < class T1 , class T2 , . . . , class Tn > class 类模板名 {// 类内成员定义 // 动态顺序表 // 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具 };public :} // 使用析构函数演示:在类中声明,在类外定义。~ Vector();T * _pData;原创 2023-05-27 15:23:34 · 43 阅读 · 0 评论 -
类和对象3
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,,而不能称作初始化。原创 2023-05-25 12:55:34 · 54 阅读 · 0 评论 -
类与对象2
如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。原创 2023-05-15 16:02:24 · 52 阅读 · 0 评论 -
C++入门
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后**接一对{}**即可,{}中即为命名空间的成员。// 1. 正常的命名空间定义 namespace lisi {// 命名空间中可以定义变量/函数/类型 int rand = 10;int val;} //2. 命名空间可以嵌套 // test.cpp namespace N1 {int a;int b;int c;int d;原创 2023-04-27 10:42:57 · 63 阅读 · 0 评论 -
类和对象1
/ 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。联函数处理。//显示基本信息 void showlnfo() {} public ://姓名 char * _sex;//性别 int age;//年龄//显示基本信息 void showlnfo();原创 2023-05-14 15:09:10 · 57 阅读 · 0 评论