![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
遥远的歌s
这个作者很懒,什么都没留下…
展开
-
C++入门C++命名空间以及C++的输入输出
什么是C ++通过学习我们知道C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度 的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。 1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语 言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C+原创 2020-05-17 15:18:36 · 259 阅读 · 0 评论 -
C++缺省参数和函数重载的介绍以及使用
缺省参数缺省参数感念缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参比如#include<iostream>using namespace std;void out(int a = 2)//定义函数时指定参数a的默认值为2{ cout<<a<<endl;}int main(){ out();//调用函数时未传如参数,则输入默认值2 out(10);//传参,则使用传入的参数,输原创 2020-05-17 16:09:49 · 291 阅读 · 0 评论 -
C++中的引用介绍以及使用与指针对比详细解释
引用在C++学习中,会有一个新的名词——引用,那么什么是引用呢?举个例子,大家都有自己的大名,也有自己的小名。其他人叫你的大名,你知道是在叫你,叫你的小名,你依然知道是在叫你。引用也是如此,它是变量的一个别名。编译器不会给引用变量开辟新的内存空间,它和它所引用的变量共用一块内存空间。再举个通俗的例子,水浒传中,李逵在家被叫铁牛,江湖上人称“黑旋风”,在这里,如果把李逵比做一个变量(引用实体),那么铁牛,黑旋风便是它的引用变量。引用的格式:类型& 引用变量名 = 引用实体。比如int a = 1原创 2020-05-18 14:39:51 · 176 阅读 · 0 评论 -
C++内敛函数,auto关键字及范围for
内敛函数函数想必大家熟悉的不能再熟悉了,那我们先来看看这个函数#include<iostream>using namespace std;int add(int a,int b){ return a + b;}int main(){ int num1 = 10; int num2 = 20; int answer = add(num1,num2); cout<<answer<<endl; return 0;}这个函数非常简单,实现两个数的原创 2020-05-18 15:38:46 · 481 阅读 · 0 评论 -
C++类于对象(类的引入,定义以及作用域)
目录1.面向对象和面向过程的初步认识2.类的引入3.类的定义4.类的访问限定符及封装5.类的作用域本章将讲述以上五个内容面向对象和面向过程的初步认识在C语言中,它主要是面向过程,即C语言主要关注的是过程,给你一个问题,你通过计算以及调用若干函数,一步步分析出求解问题的步骤,通过函数调用解决问题。注重的是过程而C++中,它是基于面向对象的,重点关注的是对象,比如,将一件事情拆分成不同的小事情,这一个个小事情便是对象,通过对象间的交互完成这件事。此外,什么是对象?说白了,对象就是变量的意思,大原创 2020-05-22 18:35:29 · 611 阅读 · 0 评论 -
C++类与对象(类对象大小的计算以及this指针介绍)
目录1.类的对象大小的计算2.类成员函数的this指针本篇讲述以上类容类的对象大小计算在C语言中,结构体中的成员变量,满足内存对齐原则,具体内存对齐原则,在我之前讲的C语言结构体中有详细说明,这里就不多说了内存对齐原则那么,C++中的类,也满足内存对齐原则,比如:class person{ int _a; char _b; double _c;};int main(){ person _A; cout<<sizeof(_A)<<endl;}运行结原创 2020-05-23 14:58:51 · 653 阅读 · 0 评论 -
C++类与对象(构造函数以及析构函数)
目录类的六个默认成员函数1.构造函数2.析构函数本篇讲述上述两种默认成员函数。当我们创建一个空类时,里面真的什么都没有吗?不是的,任何一个类,在我们不写的情况下,都会自动生成下面6个默认成员函数1.构造函数:主要完成类成员初始化2.析构函数:主要完成清理资源工作3.拷贝构造函数:用已经存在的一个对象,初始化创建另一个同类的对象4.赋值重载函数:把一个对象赋值给另一个对象5.取地址重载:取普通对象地址6.取地址重载:取const对象地址构造函数我们看下面这个类class A1{原创 2020-05-23 16:14:49 · 358 阅读 · 0 评论 -
C++类与对象(拷贝构造函数以及运算符重载)
目录1.拷贝构造函数2.赋值运算符重载函数本篇讲述以上两种默认函数拷贝构造函数我们可以创建一个对象,那么能否再创建一个和这个对象一模一样的的新的对象呢?这就引入了拷贝构造函数拷贝构造函数与之前讲的构造函数一样,函数名为类名,当用已存在的类类型的对象创建新的对象时,编译器会自动调用拷贝构造函数。class A1{public: A1(int a = 1,double b = 0.1) { _a = a; _b = b; }private: int _a; double _原创 2020-05-23 17:36:42 · 337 阅读 · 0 评论 -
C++类与对象(const修饰的成员函数以及取地址操作符重载)
目录1const修饰的成员函数2.取地址及const取地址操作符重载本篇讲述以上内容const修饰的成员函数首先,我们看一下下面这个类class A{public: A(int a = 1,double b = 0.1) { _a = a; _b = b; } void print() { cout<<"print()"<<end; cout<<_a<<" "<<_b<<endl; } vo原创 2020-05-25 14:35:21 · 196 阅读 · 0 评论 -
C++类与对象(构造函数体赋值)
构造函数体赋值之前学习了解到,在创建对象的时候,编译器会通过调用构造函数,给对象中的各个成员变量赋一个合适的初始值。class d{pubilc: d(int a,int b,int c) { _a = a; _b = b; _c = c; }private: int _a; int _b; int _c;};虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只原创 2020-06-08 14:07:30 · 2025 阅读 · 0 评论 -
C以及C++的内存管理分析以及比较
C/C++内存分布首先看下面这个代码int a= 1;void test(){ static int b = 2; char num[] = "123"; int* p = (int*)mallocsizeof(int)* 4); char* ptr = "abcd";} 对于C语言的学习,我们不难看出,a,b在数据段,num,*p,*ptr在栈,p在堆上,ptr在代码段。因此,可以做如下总结。1. 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段原创 2020-06-10 11:08:25 · 366 阅读 · 0 评论 -
C++初识模板以及模板编程
模板我们知道,如果要用一个交换函数,那么要交换int型的两个数,就需要写一个int类型的交换函数,如果交换char类型的两个字符,就需要写一个char类型的交换函数。这样会造成代码的复用率低,虽然函数重载可以实现,但是函数的复用率仍然很低,且如果一个出错,那可能所有重载都会出错,为了解决这一问题,C++中引入了模板这一概念。首先需要了解一下泛型编程的概念:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。函数模板函数模板:函数模板代表了一个函数家族,该函数模板与类型无关,在使原创 2020-06-10 11:58:01 · 225 阅读 · 0 评论 -
C++中的STL简介详细讲解
什么是STLSTL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本1.原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意 运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使 用。 HP 版本–所有STL实现版本的始祖2.P. J. 版本由P. J.原创 2020-06-11 09:54:03 · 601 阅读 · 0 评论 -
C++中的string类介绍以及使用
string类的学习zo.1 C语言中的字符串C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,若使用不当则可能还会越界访问。标准库的string类1. 字符串是表示字符序列的类2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作 单字节字符字符串的设计特性。3. string类是使用char(即作为它的字符类型原创 2020-06-11 11:13:10 · 146 阅读 · 0 评论 -
C++中的string的自我实现(常用接口)注释详细
String类自我实现函数的实现方式以及必要解释都在下述代码中注释class String{public: String()//无参构造 //初始化 :_str(new char[16]),//对_str开空间 _size(0),//初始有效字符为0个 _capacity(0)//树池容量为0 { _str[_size] = '\0';//给初始有效字符处置'\0 } String(const char* str)//带参构造 { _size =原创 2020-06-14 14:48:43 · 325 阅读 · 0 评论 -
C++中STL的vector的介绍及使用
vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是 一个相对代价高的任务,因为每当一个新的元素加入到容原创 2020-06-14 16:49:50 · 213 阅读 · 0 评论 -
C++中STL的vector自我实现(部分接口)详解
vector自我实现在库中的vector中,底层实现是由三个指针实现的,在这里我就用_start,_finish和_eos实现必要解释都在代码中加以注释//运用模板,以便vector中实现各种数据类型template <class T>class Vector//自我实现的Vector{public: //Vector的构造函数实现 Vector() //初始化列表 :_start(nullptr)//指向有效元素的第一个位置 , _finish(nullptr)//原创 2020-06-24 09:21:22 · 192 阅读 · 0 评论 -
C++STL的list使用详细讲解
list容器介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。与其他序列式容器相原创 2020-07-02 10:34:55 · 359 阅读 · 0 评论 -
C++list的自我实现
list实现#include <iostream>using namespace std;//List: 双向带头循环链表template < class T>struct ListNode{ T _value; ListNode<T>* _next; ListNode<T>* _prev; ListNode(const T& val = T()) :_value(val) , _next(nullptr) , _原创 2020-07-02 10:40:55 · 147 阅读 · 0 评论 -
C++容器—栈使用以及最小栈
容器栈栈的介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作: empty:判空操作back:获取尾部元素操作push_back:尾部插入元素原创 2020-07-06 09:11:18 · 328 阅读 · 0 评论 -
C++容器—队列以及队列的自我实现
队列介绍队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端 提取元素。队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的 成员函数来访问其元素。元素从队尾入队列,从队头出队列。底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操 作: empty:检测队列是否为空size:返回队列中有效元素的个数front:返回队头元素的引用back:返回队尾元素的引用原创 2020-07-06 09:27:41 · 651 阅读 · 0 评论 -
优先级队列— priority_queue详细解说以及使用
priority_queue介绍之前所说的队列,是按照给的顺序逐一入队,而这里要说的优先级队列,底层实现是通过堆来实现的,优先级队列,顾名思义,在入队的时候,就会按照数据大小拍好序来入队,在默认情况下,优先级队列的实现是通过大堆来实现的。具体的概念如下:1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。3. 优先队列被实现为容器适配器,容器适配器即将特定原创 2020-07-06 10:09:56 · 696 阅读 · 0 评论 -
C++模板进阶,模板特化详细讲解
模板进一步介绍1. 非类型模板参数这里的模板参数,及出现在参数模板列表的位置template<class T,size_t n = 10>class a{public: //[]运算符重载 T& operator[](size_t index){return _array[index];}private: T _array[n];//定义一个T类型的数组 //n可以当作常量使用};注意:浮点数、类对象以及字符串是不允许作为非类型模板参数的。非类型的模板原创 2020-07-09 13:49:31 · 367 阅读 · 0 评论 -
C++继承,多继承,菱形继承等超详细讲解
继承概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。class A{public: A(int a) :_a(a) {} void print() { cout<<"i am son"<<endl; }privat原创 2020-07-20 11:11:24 · 581 阅读 · 0 评论 -
C++多态的实现原理,虚函数超级详解
多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优 先买票。再举个栗子: 最近为了争夺在线支付市场,支付宝年底经常会做诱人的扫红包-支付-给奖励金的活动。那么 大家想想为什么有人扫的红包又大又新鲜8块、10块…,而有人扫的红包都是1毛,5毛…。其实这背后也是 一个多态行为。支付宝首先会分析你的账户数据,比如你是新用户、比如你没有经常支付宝支付等等原创 2020-07-22 10:15:47 · 329 阅读 · 4 评论 -
二叉搜索树的实现超详细解说
二叉搜索树二叉搜索树是搜索树的一种,虽然效率相比于平衡二叉树以及红黑树和B+树的搜索效率低,但它是这几类搜索树的基础,所以,掌握二叉搜索树是必须的,首先,先看一下二叉排序树的样子每一个结点的左边都是小于它本身的值,右边都是大于它本身的值。这样,中序遍历一遍之后,就是一个有序数列。二叉搜索树的平均搜索效率是O(logn),当然也有最坏的情况,及单枝树,如果是单枝树搜索效率也就变成了O(n),所以,也就有了后面的平衡二叉树。结点创建结点创建如下template<class T,class K&原创 2020-07-27 11:42:51 · 177 阅读 · 0 评论 -
平衡二叉树(AVLTree)的构造等——超详细
平衡二叉树概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年 发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之 差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:1.它的左右子树都是AVL原创 2020-07-28 12:41:55 · 2453 阅读 · 2 评论 -
关联式容器概念介绍
关联式容器我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这 些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容 器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。这样的结构通常叫做KV键值对,及和查字典一样,我通过拼音找到这个字,就可以看和这个字有关的信息。那原创 2020-08-04 14:33:37 · 1483 阅读 · 0 评论 -
set介绍以及使用(c++)
set简介set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素 不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用二叉搜索树(红黑树)实现的。set的原创 2020-08-04 15:07:28 · 515 阅读 · 0 评论 -
map介绍以及使用(c++)
map介绍map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值 key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_type绑定在一起, 为其取别名称为pair: typedef pair value_type;在内部,map中的元素总是按照键值key进行比较排序的。map中通过键值访问单个元素的速度通常原创 2020-08-05 10:49:13 · 1265 阅读 · 0 评论 -
红黑树(RBTree)的简单操作
红黑树介绍红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过 对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。性质每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的对于每个结点,从该结点到其所有后代叶结点的简单路径上,均 包含相同数目的黑色结点每个叶子结点都是黑色的(此处的叶子结点指的是空结点)如下图为一颗红黑树比如17这个结点开始,原创 2020-08-11 14:13:04 · 348 阅读 · 0 评论 -
哈希结构介绍及实现(线性探测)——闭散列解决哈希冲突
哈希介绍顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经 过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( logN),搜索的效率取决 于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过 某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函 数可以很快找到该元素。插入元素 :根据待插入元素的关键码,以此函原创 2020-09-07 11:26:45 · 691 阅读 · 0 评论 -
C++11之右值以及右值引用
右值的介绍在引入右值之前,我们先来了解一下左值,左值在日常代码中非常常见,我们定义的变量大多数都是左值。简单理解就是,左值既可以出现在=的两边,或者是可以取地址的变量。比如:void testL(){ int a = 10;//a就是一个左值 int b = a;//b也是一个左值 //因为a,b是左值,所以可以取它门的地址 int *pa = &a; int *pb = &b;}那么与他对应起来的右值便是:只能出现在=的右边,或者不可以取地址这里并不是绝对的,但是可原创 2020-09-15 16:55:32 · 326 阅读 · 0 评论 -
C++之lambda表达式的介绍
lambda表达式的引出如果我们想要对一组数据进行排序,则可以使用sort函数来排序,但是对于自定义类型调用此函数的时候,我们需要来自定义比较大小的逻辑,比如下面这个例子class A{public: A(int a = 0) :_a(a) {} //自己定义比较大小的逻辑函数 bool operator>(const A& a) const { return _a > a._a; } bool operator<(const A原创 2020-09-22 17:25:05 · 320 阅读 · 0 评论 -
C++智能指针以及自我实现
为什么需要智能指针我们知道,内存泄漏是一件非常严重的错误,这要求如果malloc内存就一定要有对应的free,new了内存也一定要有对应的delete。但是如果程序员忘记写上对应的释放空间的操作符或者函数,那么就会出现内存泄漏,或者程序员写上了,但是中间某个逻辑导致程序崩溃了,并没有走释放空间的语句,那么也会造成内存泄漏,因此,为了防止内存泄漏的发生,C++11中引入了智能指针来管理空间。内存泄漏什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存原创 2020-12-05 17:22:22 · 373 阅读 · 0 评论 -
C++异常处理机制
C语言传统处错误的方式终止程序,如assert,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误C 标准库中setjmp和longjmp组合。这个不是很常用,可以了解一下实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。鉴于上述的错误处理机制对程序员来说不是很友好,于是C++中就引入了异常处理机制。C++异常的概念异常是一原创 2020-12-03 11:47:12 · 416 阅读 · 0 评论