C++
文章平均质量分 92
C++基础知识
Gay~
Those times you get up early you work hard,Those times you stay up late and you word hard,Those times when you don't feel like working,you too tired,you don't want to push yourself,but you do it anyway,That is actually the dream,That's the dream,it's not the destnation,it's the journey.
展开
-
C++ IO流
使用cin进行标准输入,即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不。2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。原创 2023-10-18 01:41:06 · 200 阅读 · 0 评论 -
C/C++类型转换
缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用。static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。原创 2023-10-17 15:13:51 · 97 阅读 · 0 评论 -
特殊类的设计
如果单例对象构造十分耗时或者占用很多资源,比如加载插件, 初始化网络连接,读取文件等等操作时,并且有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,就会导致程序启动时非常的缓慢。以上就是常见的特殊类的设计,你学会了吗?今天的分享就到这里啦,如果你感觉到有所收获,那么就点点小心心点点关注呗,后期还会持续更新C++的相关知识哦,我们下期见!信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。原创 2023-10-16 00:07:54 · 316 阅读 · 0 评论 -
C++11智能指针
C++中的智能指针是一种特殊类型的指针,它能够自动管理动态分配的内存资源,从而简化内存管理的过程并减少内存泄漏的风险。智能指针通过在对象上使用引用计数技术来跟踪资源的使用情况,并在不再需要该资源时自动释放它。这种自动化的内存管理可以帮助开发人员避免手动释放内存的繁琐工作,并减少因忘记释放内存而导致的错误。什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对。原创 2023-10-15 11:15:31 · 220 阅读 · 0 评论 -
C++11(下)
例如现在有一个string类,这是一个深拷贝的类,我们实现了析构,拷贝构造,赋值,但是没写移动构造和移动赋值。所以说,如果是深拷贝的类,即我们要自己实现析构,同时要实现拷贝构造,赋值重载函数时,我们就要自己实现移动构造和移动赋值,如果我们没有实现析构,拷贝构造,赋值中的任意一个,说明我们写的类是浅拷贝的类,这时编译器才会自动给我们生成移动构造和移动赋值,默认生成的移动构造对于内置成员完成值拷贝、浅拷贝,对于自定义类型会看它有没有实现移动构造,有实现就调用移动构造,没有实现就调用拷贝构造。原创 2023-10-09 23:34:42 · 995 阅读 · 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年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2023-09-28 01:01:44 · 76 阅读 · 0 评论 -
哈希 -- 位图、布隆过滤器、海量数据处理
这显然不符合,你压根就不存在布隆过滤器中,你如何删除。虽然是100亿个整数,但是整数最多也就40多亿个,所以一个位图占用的空间还是500M,因为要找出只出现一次的整数,如果只用一个位图只能标志一个数在不在,并不能很好的统计该数出现的次数,所以我们可以用两个位图来表示一个数字出现的次数,因为两个比特位可以表示出四种情况,00表示出现了0次,01表示出现了1次,10表示出现了2次,11表示出现了3次,如果一个数字出现了2次以上的就标志为11就行了,因为我们要找的是出现一次的数字,2次及以上的都是不符合要求的。原创 2023-09-24 18:04:24 · 149 阅读 · 0 评论 -
利用哈希表封装unordered_map和unordered_set
利用哈希表封装unordered_map和unordered_set原创 2023-09-19 18:54:04 · 94 阅读 · 0 评论 -
C++数据结构 -- 哈希表
因为我们计算元素在数组中存储的位置是通过除留余数法计算的,即用key模数组的大小得到的余数就是该元素在数组中的存储位置,也就意味着我们的key必须要是整形,因为只有整形才能取模,那么如果我们存储的key是一个字符串呢,字符串是不能取模的,这个时候我们该怎么处理呢?原创 2023-09-18 00:04:08 · 179 阅读 · 0 评论 -
利用红黑树封装map和set
利用红黑树封装map和set原创 2023-09-15 14:15:27 · 126 阅读 · 0 评论 -
C++数据结构--红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。原创 2023-09-11 22:39:08 · 687 阅读 · 1 评论 -
C++数据结构 -- AVL树
一棵AVL树是空树或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)(我们用的是右子树高度减左子树高度)原创 2023-09-09 21:02:26 · 270 阅读 · 0 评论 -
C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者(程序员)基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。原创 2023-08-15 00:51:33 · 173 阅读 · 1 评论 -
map和set的使用总结
set是按照一定次序存储元素的容器。在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set的底层是二叉搜索树(红黑树)。原创 2023-08-07 01:46:16 · 119 阅读 · 0 评论 -
二叉搜索树
key_val,就往左树走,key>root->_val,就往右树走,如果遇到相等的节点就应该返回了,不能插入(二叉搜索树的性质),一直走直到走到一个空树,那么这个位置就是新结点插入的位置,但是在插入之前要先用key值与该空节点的父节点的值比较一下,如果key>parent->_val,就插入到parent->right;对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二叉搜索树的深度的函数,即结点越深,则比较次数越多。就插入到parent->left。原创 2023-08-01 18:37:01 · 203 阅读 · 4 评论 -
C++面向对象三大特性 -- 多态(重点)
构成多态的条件:一、父类的指针或者引用调用虚函数。二、虚函数的重写。原创 2023-07-26 16:53:54 · 268 阅读 · 5 评论 -
C++面向对象三大特性 -- 继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的新的类,称派生类或子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public :} public :string _name = "张三";public ://继承后父类的Person的成员(成员函数+成员变量)都会变成子类Student的一部分。原创 2023-07-24 17:08:14 · 144 阅读 · 5 评论 -
模板的进阶
模板的优缺点优点:1、模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生。2、增强了代码的灵活性。缺点:1、 模板会导致代码膨胀问题,也会导致编译时间变长。2、 出现模板编译错误时,错误信息非常凌乱,不易定位错误,这个非常的恶心。原创 2023-07-21 19:07:10 · 82 阅读 · 4 评论 -
C++STL -- 适配器(stack&queue&&优先级队列&&反向迭代器(配详细注释))
在C++中,适配器是一种设计模式,它用于将一个类的接口转换成另一个类的接口,以满足不兼容的接口之间进行交互的需求。适配器模式可以解决不同类之间接口不匹配的问题,使它们能够协同工作。简单来说,适配器就是对已经存在的类的重新封装,更直接地说就是对已经存在的类的接口进行重新封装,得到我们想要的类及其需要的接口,来满足我们的需求。原创 2023-07-21 01:10:42 · 260 阅读 · 4 评论 -
STL容器 -- list的模拟实现(配详细注释)
list容器的迭代器和前面的string和vector就不一样了,为什么呢?通过string和vector的性质可以发现,string和vector的底层都是用数组实现的,数组是具有连续的空间的,但是list就不同了,list底层是一个一个的节点连接起来的,并不是连续的空间,迭代器的要求是迭代器++能够指向下一个元素,迭代器“*”解引用能够找到这个迭代器指向的对象。原创 2023-07-17 18:27:32 · 298 阅读 · 7 评论 -
STL容器 -- vector的模拟实现(配详细注释)
在C++的STL(Standard Template Library)中,vector是一种动态数组容器。它提供了一种存储和访问元素的方式,类似于固定大小的数组,但具有动态调整大小的能力。vector容器可以在运行时根据需要自动调整大小,可以在末尾快速添加或移除元素。它提供了一组成员函数和迭代器,用于访问和操作容器中的元素,例如插入、删除、查找元素等。原创 2023-07-15 18:14:11 · 323 阅读 · 15 评论 -
C++模拟实现string类
在C语言中,字符串是以'\0'结尾的字符的集合,为了操作方便,C标准库中已经提供了一些str系列的库函 数,但是这些库函数与字符串是分离的,不符合面向对象编程的思想,而且底层空间需要用户自己管理,很可能会造成越界访问。原创 2023-07-07 22:36:18 · 541 阅读 · 22 评论 -
模板(初阶)
我们能否给编译器一个模子,让编译器根据不同的类型利用该模子来生成一份对应的代码呢?基于这样的问题,C++就出现了模板,之后又推出了泛型编程。原创 2023-05-21 19:28:11 · 423 阅读 · 4 评论 -
C/C++内存管理
operator new与operator delete是开空间和释放空间的函数,在我们使用new/new[]申请空间时,首先会调用operator new开辟空间,然后调用构造函数初始化;使用delete/delete[]释放空间时,会先去调用析构函数清理资源,再去调用operator delete释放空间。这些函数的调用顺序是不能够颠倒的。(重要)原创 2023-05-19 01:30:58 · 418 阅读 · 7 评论 -
类和对象(下)
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。(原因:静态成员变量是属于整个类的,不属于某一个对象,所以在构造函数的地方静态成员变量不会走初始化列表,即在创建对象的时候不会进行初始化,所以必须要在类外面初始化)原创 2023-05-11 23:03:54 · 471 阅读 · 11 评论 -
类和对象(中)
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。拷贝构造函数:只有一个形参,该形参是本类类型对象的引用(一般用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。原创 2023-05-01 13:11:29 · 619 阅读 · 6 评论 -
类和对象(上)
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。在C++中结构体升级成了类,在类中定义的变量成为成员变量,在类中定义的函数成为成员函数。原创 2023-04-30 00:23:04 · 486 阅读 · 3 评论 -
C++入门篇(二)
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。简单来说就是,比如张三,在学校的外号可能叫小张,但是本质上张三和小张都是同一个人,小张只不过是张三的别名而已。如何定义引用:类型& 引用变量名(对象名) = 引用实体例如:int a=10;int& b=a;那么b就是a的引用。b和a都是指向同一块空间,也就是说,改变a的同时也会改变b,相反,改变b也会改变a。注意:引用类型必须和引用实体是同种类型的。原创 2023-04-21 17:30:34 · 539 阅读 · 11 评论 -
C++入门篇(一)
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 参数类型 或 参数类型的顺序)不同,常用来处理实现功能类似数据类型不同的问题。原创 2023-04-16 23:56:39 · 410 阅读 · 5 评论