c++
文章平均质量分 95
从C语言过渡到c++的学习,满满的干货哦
一朵猫猫菇
一篇更比六篇强
展开
-
【C++】类型转换和IO流
首先我们看看C语言中的类型转换:在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化C隐式类型转换和显式类型转换。1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2.显式类型转化:需要用户自己处理int main()int i = 1;// 隐式类型转换// 显示的强制类型转换对于上面这种C语言的类型转换其实是有一些缺陷的,原创 2023-07-01 13:02:03 · 703 阅读 · 92 评论 -
【C++】定制删除器和特殊类设计(饿汉和懒汉~)
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。原创 2023-06-27 19:18:54 · 1237 阅读 · 85 评论 -
【C++】auto_ptr为何被唾弃?以及其他智能指针的学习
1. C++ 98中产生了第一个智能指针auto_ptr.给出了更实用的scoped_ptr和shared_ptr和weak_ptr.3. C++ TR1,引入了shared_ptr等。不过注意的是TR1并不是标准版。4. C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。需要注意的是unique_ptr对应boost的scoped_ptr。并且这些智能指针的实现原理是参考boost中的实现的。原创 2023-06-24 19:25:39 · 1558 阅读 · 88 评论 -
【C++】C++关于异常的学习
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。原创 2023-06-22 19:30:22 · 3704 阅读 · 84 评论 -
【C++】C++11:线程库和包装器
上一篇文章中我们详细讲解了lambda表达式的使用,我们今天所用的线程相关的知识会大量的用到lambda表达式,所以对lambda表达式还模糊不清的可以先将上一篇文章看明白。一、线程库在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含。原创 2023-06-20 11:23:12 · 615 阅读 · 66 评论 -
【C++】C++11新特性重点:可变参数+lambda
上一篇我们重点讲解了右值引用+移动语义,关于移动构造和移动赋值还有一些需要补充的知识:如果你没有自己实现移动构造函数,且没有实现析构函数 、拷贝构造、拷贝赋值重载中的任意一个。那么编译器会自动生成一个默认移动构造。默认生成的移动构造函数,对于内置类型成员会执行逐成员按字节拷贝,自定义类型成员,则需要看这个成员是否实现移动构造,如果实现了就调用移动构造,没有实现就调用拷贝构造。原创 2023-06-17 19:51:21 · 1239 阅读 · 109 评论 -
【C++】C++11新特性的讲解
C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。相比于C++98/03C++11。原创 2023-06-03 16:14:40 · 803 阅读 · 93 评论 -
【C++】海量数据处理面试题(位图和布隆过滤器)
布隆过滤器的查找布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1。分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。布隆过滤器删除布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。比如:删除上图中"tencent"原创 2023-06-02 18:42:44 · 1166 阅读 · 82 评论 -
【C++】哈希表封装unordered系列
在看本篇文章前大家尽量拿出上一篇文章的代码跟着一步步实现,否则很容易引出大量模板错误而无法解决。一、哈希表的封装首先我们要解决映射的问题,我们目前的代码只能映射整形,那么如何支撑浮点数等的映射呢?这个仿函数可以将任何支持隐式类型转换的key转换为size_t类型,比如double类型会被隐式转换为size_t类型,那么字符串该如何解决呢?我们直接用模板特化来解决:(模板的特化就是有特化就走特化,没有特化就走原类型)hashi += e;原创 2023-05-31 12:47:51 · 1308 阅读 · 105 评论 -
【C++】“最强查找“哈希表的底层实现
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O(logN),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。原创 2023-05-27 15:28:55 · 1672 阅读 · 75 评论 -
【C++】unordered_map和unordered_set的使用
unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(logN),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。原创 2023-05-25 18:23:04 · 1018 阅读 · 91 评论 -
【C++】用红黑树迭代器封装map和set
一、红黑树原先代码的修改首先我们拿出STL中的源代码,看看大佬是如何进行封装的:我们可以看到在STL中map的模板参数是Key和T,这没毛病很显然是KV结构,那么底层红黑树key_type和value_type是什么?其中Key是KeyType的别名,value是pair的别名,也就是说map有两个模板参数一个是key,一个是为pair的value,这个pair大家要记住也是一个键值对。那么这到底是怎么回事呢?原创 2023-05-23 12:57:23 · 840 阅读 · 138 评论 -
【C++】如何克服红黑树的恐惧?看这篇文章足够了
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(log N),红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。原创 2023-05-20 15:53:22 · 969 阅读 · 119 评论 -
【C++】set和map的底层AVL树的实现
上一篇文章对其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此mapset等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL树的概念:二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家和E.M.Landis在1962。原创 2023-05-18 12:47:25 · 1087 阅读 · 94 评论 -
【C++】数据结构的恶龙set和map来了~
1.关联式容器在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高2.键值对用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和valuekey代。原创 2023-05-16 14:43:53 · 1300 阅读 · 132 评论 -
【C++】程序员的屠龙母鸡:二叉树进阶OJ题详解
在看这篇文章前希望大家是学过二叉树的,不然理解起来可能会比较费劲,但我会尽自己的努力让大家学会这些题(都是往年大厂必考题哦~),本次一共包含了12道二叉树的OJ题,力扣与牛客网都有,大家要做的话直接点我发的链接即可。二叉树进阶的OJ题相对比初阶难了不少,大多数情况需要通过画图的方式去演示,所以我们在做这类题目的时候一定要先想清思路,思路清晰了答案也就显而易见了。原创 2023-04-29 16:27:08 · 1068 阅读 · 83 评论 -
【C++】:想知道如何实现互译字典吗?来看二叉搜索树
二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二叉搜索树也被叫做二叉排序树或二插查找树。原创 2023-04-26 20:07:42 · 1114 阅读 · 86 评论 -
【C++】面试官:你小子,继承与多态的题你都会
上一篇文章我们详细了介绍了多态,用汇编一步一步的查看了多态的实现原理,讲解了这么多理论知识该做一些面试题了,这些面试题都是历年来大厂所出的笔试题,希望大家可以把我今天所讲的全部学懂~原创 2023-04-24 16:26:01 · 3687 阅读 · 142 评论 -
C++ :Lambda函数的浅学习
lambda表达式又被称之为lambda函数,是c++11的新特性,下面我们看一下lambda表达式的参数等说明:[函数对象参数](操作符重载函数参数)mutable或exception声明->返回值类型{函数体下面我们说明一下参数类型以及变量截取规则:1.[函数对象参数]:捕捉列表。捕捉列表总是出现在lambda函数的开始处,[]是lambda函数的引出符,这个必须存在不可以省略。编译器会根据引出符判断接下来的代码是否是Lambda函数。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用。原创 2023-04-20 16:15:17 · 640 阅读 · 103 评论 -
[C++]:万字超详细讲解多态以及多态的实现原理(面试的必考的c++考点)
多态的概念:多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。学习多态前我们必须知道虚函数,虚函数的关键字为virtual,虚函数与之前学的虚继承没有任何关系,只是共用了同一个关键字。虚继承是为了解决多继承中数据冗余和二义性的问题,而虚函数是为了实现多态。多态是在不同继承关系的类对象,去调用同一个函数,产生了不同的行为。原创 2023-04-20 16:28:16 · 1463 阅读 · 140 评论 -
【c++】“谁想继承我的花呗-.-“继承的学习
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用1.很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。原创 2023-04-07 09:07:40 · 806 阅读 · 81 评论 -
【c++】深入学习c++中的模板
我们在前几篇的学习中只是使用了最简单的模板,比如用一个模板类等等,我们这篇的学习将在以前的基础上再深入的学习一下模板。【优点】1.模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生2.增强了代码的灵活性【缺陷】1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2023-04-04 14:56:20 · 792 阅读 · 66 评论 -
【c++】:反向迭代器适配器:每天学一点点优秀的思想
反向迭代器的适配只用于双向迭代器,对于单链表实现的单向迭代器是不能通过适配构造一个反向迭代器的,为什么要说反向迭代器适配器呢?因为我们只需要实现一个反向迭代器模板就可以用所有的双向迭代器的正向实现其反向迭代器。提示:以下是本篇文章正文内容,下面案例可供参考对于迭代器的适配器最重要的是实现的思想,比如我们如何控制对迭代器进行解引用,++--等等,想要有如同大佬一般的思想我们必须多看优秀的代码,只有去看别人写的优秀的代码我们才能进步。原创 2023-04-02 10:17:23 · 1400 阅读 · 69 评论 -
【c++】:“无敌的适配器来咯“栈和队列模拟实现以及优先级队列的模拟实现。
栈的介绍和使用:1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back:获取尾部元素操作。原创 2023-03-29 19:37:26 · 1053 阅读 · 73 评论 -
【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2023-03-26 19:27:31 · 2030 阅读 · 66 评论 -
【c++】:STL中vector的模拟使用及模拟实现
上一篇我们讲解了STL中的string的使用和模拟实现,这次我们就来讲解STL中的vector,vector相对于string来说模拟实现会难一些,难点在于迭代器失效问题和深浅拷贝问题。首先介绍一下vector:1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vecto的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。原创 2023-03-18 20:29:04 · 1571 阅读 · 89 评论 -
【c++】:模拟实现STL模板中的string
上一篇文章我们详细介绍了STL中的string的一些常用的接口,这一篇文章我们将从底层实现string类,当然我们只是实现一些重要的,经常使用的接口,并且不是完全按照STL中的string去走的。string由于c++历史原因很多接口都是功能相近的,一共一百多个接口显得太冗余,通过我们的模拟实现string能加深我们对string中常用接口的认识,并且在使用的过程中也能更加游刃有余,下一篇我们将讲解STL中vector的常用接口。原创 2023-03-15 09:09:53 · 2159 阅读 · 87 评论 -
【c++】:STL模板中string的使用
文章目录STL简介 一.认识string 二.string中基本功能的使用 总结STL简介STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费原创 2023-03-09 08:36:59 · 1585 阅读 · 81 评论 -
c++模板的简单认识
文章目录前言 一.泛型编程 函数模板 模板参数的匹配原则 类模板 总结前言ADD函数很好写,但是如果我们要有int类型的,double类型的,char类型的等等各种类型,难道要写这么多不同的ADD函数吗,这么写简直太麻烦了,所以有了泛型编程的概念。一、泛型编程实现一个通用的ADD函数有很多办法,就比如函数重载,但是函数重载又有很多的缺点,比如:1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就原创 2023-02-22 16:33:50 · 1167 阅读 · 38 评论 -
c++动态内存分布以及和C语言的比较
文章目录前言 一.c/c++内存分布 C语言的动态内存管理方式 C++内存管理方式 operatornew和operatordelete函数 malloc/free和new/delete的区别 定位new 内存泄漏的危害 总结前言c++是在c的基础上开发出来的,所以关于内存管理这一方面是兼容c的,比如以前C语言的malloc等等都是可以继续使用的,但是靠C语言以前的东西是解决不了c++中的问原创 2023-02-20 17:56:25 · 995 阅读 · 28 评论 -
c++终极螺旋丸:₍˄·͈༝·͈˄*₎◞ ̑̑“类与对象的结束“是结束也是开始
文章目录前言 一.构造函数中的初始化列表 拷贝对象时的一些编译器优化 二.static成员 三.友元 四.内部类 总结前言前两期我们将类和对象的重点讲的差不多了,这一篇文章主要进行收尾工作将类和对象其他的知识点拉出来梳理一遍,并且补充前两篇没有讲过的小细节。一、构造函数中的初始化列表在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。为什么加入了一个const变量就无法引用默认的构造函数了呢?我们原创 2023-02-15 22:29:47 · 892 阅读 · 20 评论 -
c++重中之重:“换个龟壳继续套娃“:运算符重载等的学习
文章目录前言 一.运算符重载 二.const成员 三.取地址重载 总结前言上一期我们讲到类的6个默认构造函数中的拷贝构造函数,这一期我们继续往下讲,当然难点肯定是运算符重载了。一、运算符重载运算符重载是c++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数相似。函数名字为:关键字operator后面接需要重载的运算符符号函数原型:返回值类型o原创 2023-02-13 18:04:25 · 879 阅读 · 12 评论 -
【c++】类和对象:让你明白“面向一个对象有多重要”:构造函数,析构函数,拷贝构造函数的深入学习
文章目录什么是面向对象? 一:类是什么? 1.类的访问限定符 2.封装 3.类的实例化 4.this指针 二:类的6个默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 什么是面向对象?c语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。比如洗衣服:c++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间原创 2023-02-11 10:54:43 · 948 阅读 · 7 评论 -
c++关键字,命名空间,缺省参数,函数重载,引用,内联函数auto等学习
文章目录前言 1.c++关键字 2.命名空间 3.c++输入输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值 - --nullptr 总结前言C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。c++补充了C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。一、c原创 2023-02-05 22:41:33 · 1114 阅读 · 10 评论