![](https://img-blog.csdnimg.cn/8173fa281b994dbb8dcf41d44e8ecf04.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 90
C++相关知识讲解
cls-evd
南风知我意,吹梦到西洲
展开
-
C++之deque
双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。原创 2024-02-23 22:55:35 · 939 阅读 · 0 评论 -
C++之stack与queue的模拟实现
stack的文档介绍翻译:1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作back。原创 2024-02-23 22:03:03 · 955 阅读 · 0 评论 -
extern “C“
C++程序调用C的库,在C++程序中加extern "C"。在C++项目里,告诉C++编译器,extern C{}里面的函数是C编译器编译的,链接的时候用C的函数名规则去找,就可以链接上。C程序调用C++的库。在C++库中加extern "C"。在C++静态库,extern C告诉编译器以下函数按照C的函数名修饰规则去处理。原创 2024-01-25 16:34:51 · 1054 阅读 · 0 评论 -
C++11
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址+可以对它赋值左值可以出现赋值符号的左边,右值不能出现在赋值符号左边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。综合而言,左值就是可以取地址的对象。这个b也认定成左值,它很特殊,因为一般的左值都是可以取地址和赋值的,这个b只能取地址不能赋值。右值也是一个表示数据的表达式,如:字面常量、表达式返回值,传值返回函数的返回值(这个不能是左值引用返回)等等,原创 2023-03-05 19:03:49 · 2272 阅读 · 1 评论 -
C++之异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。(异常一般是在比较大的项目中才会出现的)基类一般包含这两个成员errmsg与id,比如说:微信发消息,如果是出现权限问题(本来我们是好友,但是对方把你拉黑了),我给你发消息就失败了,就直接报错,给一个提示“你已经不是对方的好友”。原创 2023-03-05 19:01:39 · 316 阅读 · 0 评论 -
C++之智能指针
内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。原创 2023-03-05 19:02:52 · 3018 阅读 · 0 评论 -
C++之单例模式
Singleton.h中有一个callCount的定义,Singleton.h被Singleton.cpp和test.cpp都所包含。.h文件在.cpp文件中展开,.cpp会生成两个.obj(linux下叫做.o)然后这两个.obj中都有一个叫做callCount的变量。原创 2023-03-05 19:00:46 · 881 阅读 · 2 评论 -
C++之空间配置器
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。一块大的内存,vector申请了100字节,list申请了48字节,string申请了8字节,剩下的内存也都分配出去了。过来一会图中蓝色区域的内存都还回来了(容器释放内存),现在有124字节的内存,但是我们要申请一个大于100字节的内存,会申请不出来。原创 2023-03-05 19:01:41 · 434 阅读 · 0 评论 -
C++之Map与Set的模拟实现
前言:看这篇博客前首先得看博主关于红黑树的实现:C++之红黑树_cls-evd的博客-CSDN博客目录前言:看这篇博客前首先得看博主关于红黑树的实现:C++之红黑树_cls-evd的博客-CSDN博客一、set与map的源码分析源码中的set:编辑源码中的map:编辑源码中的红黑树:编辑二、map与set的建立三、红黑树节点的修改四、红黑树的修改insert的修改五、迭代器的实现迭代器的大框架begin的实现end的实现operator++的实.原创 2022-05-28 20:49:51 · 427 阅读 · 1 评论 -
日期类的实现-class Date
原创 2022-05-24 11:45:27 · 302 阅读 · 1 评论 -
C++之红黑树
红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 4.2.2 红黑树的性质 1. 每个结点不是红色就是黑色 2. 根节点是黑色的3. 如果一个节点是红色的,则它的两个孩子结点是黑色的,但是没有连续的红节点4. 对于每个结点,从该结点到其所有后代叶结点的简单路径...原创 2022-05-23 22:03:00 · 1643 阅读 · 7 评论 -
C++之AVL树
前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是: 其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。AVL 树AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表原创 2022-05-23 21:20:30 · 773 阅读 · 0 评论 -
C++进阶之map与set
stl中将数据结构叫做容器。容器分为序列式容器:vector/list... 就类似线性表关联史容器:map/set.. 数据之间有强烈的关联性,底层是搜索树栈和队列是适配器set底层就是搜索树。void test_set1(){ //排序+去重 set<int> s; s.insert(3); s.insert(1); s.insert(8); s.insert(2); s.insert(5); s.insert(5); s.insert(5)原创 2022-05-23 20:39:37 · 2360 阅读 · 0 评论 -
C++之二叉树进阶
二叉搜索树之前我们提过普通二叉树价值不大,二叉树要叠加一些性质才能变的非常有价值。二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树比如查6,比根大在右树去找,比7小在左树去找就找到了,一共三次。最多查找高度次O(logN) (这是在不极端的情况下,能做到满二叉树或完全二叉树的情况) 。eg:10亿个数原创 2022-05-08 21:10:46 · 604 阅读 · 0 评论 -
C++进阶之多态
多态的概念 概念:多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。静态的多态:函数重载,看起来调用同一个函数有不同的行为。静态指的是在编译时实现的。eg:流提取运算符的重载,自动识别不同的类型动态的多态:一个父类的引用或者指针去调用同一个函数,传递不同的对象,会调用不同的函数。动态就是指运行时实现的。本质:不同的人去做同一件事情,结果不同eg:class Person {public: virtual void Bu原创 2022-04-27 17:40:03 · 1034 阅读 · 4 评论 -
VS如何在debug版本下查看内联函数的优化?
我们都知道在debug版本下,inline优化在调试过程中是看不到的,只有在release版本下,你定义的内联函数才会被优化,但是release版本是不能进行调试的。为了观察到inline的优化,我们可以通过更改debug版本的一些属性实现观察。步骤1:右键单击你的项目单击属性步骤二:找到C/C++中的常规,将调试信息格式更改为程序数据库。步骤三:将优化中的内联函数扩展更改为只适用yu_inline(/Ob1).这样就可以在debug版本下中的调试观测到内...原创 2022-04-27 17:06:59 · 1861 阅读 · 0 评论 -
C++进阶之继承
继承的本质是一个复用,之前复用最多的地方是函数中复用,继承则体现在类假设我设计老师与学生这两个类,发现他俩具共同有的,有都有自己独立拥有的,如果我们像下图一样再写一遍,就会造成代码冗余为了解决这个问题就需要用到继承,我们可以用一个Person类存放他俩公有的,用Person链接teacher和student,这样就保证了student和teacher可以用Person中的信息这个Person就叫做父类或者基类,student和teacher就叫做子类或者派生类。体现在语法上就是.原创 2022-04-20 18:31:56 · 1505 阅读 · 1 评论 -
字符指针的一些问题
目录字符指针第一种使用方式第二种使用方式为什么字符指针存储字符串要加const?笔试题字符指针在指针的类型中我们知道有一种指针类型为字符指针 char* ;第一种使用方式int main(){ char ch = 'w'; //字符变量 char* pc = &ch; //pc指向一个字符变量,pc是个指针变量,pc指向的类型是一个char类型,pc指向ch,ch的类型就是char}ch是一个字符变量。pc指向一个字符变量,pc是...原创 2022-03-20 15:46:23 · 377 阅读 · 1 评论 -
C++入门之vector的模拟实现
vector源代码的大致框架,vector本质就是一个模板类vector的成员变量不再是我们熟悉的size,capacity,而是变成了功能一致的三个指针namespace pxl{ template<class T> class vector { public: typedef T* iterator; private: iterator _start; iterator _finish; iterator _endofstora.原创 2023-03-26 19:39:07 · 1073 阅读 · 0 评论 -
C++入门之vector
vector的介绍及使用首先要包头文件#include<vector>vector底层就是一个动态的顺序表构造函数vector<char>能替代string吗?答:不能,1. 因为字符串后面有 '\0' 2.string有些特殊的接口比如+=,比较大小等接口尾插push_back()vector的遍历[ ]的遍历int main(){ vector<int> v; v.push_back(1); v.push_back原创 2023-03-26 16:15:02 · 492 阅读 · 0 评论 -
C++入门之String的模拟实现
因为初始化string的时候,原创 2023-03-26 21:49:12 · 797 阅读 · 1 评论 -
C++入门(六)之String
为什么字符串类型会是T,字符串类型不就是char类型吗,难道还有别的类型?这个地方就与编码有关,计算机是由美国人发明的,早起计算机只是显示英文的,显示英文就比较的简单,单纯的需要32个英文字母进行组合就可以,算上大小写,及标点符号一共也就128个,去表示常见的英文绰绰有余,计算机存储英文(只有二进制)编码就是一个值与对应的符号建立映射关系,这个映射关系就叫做编码表。英文的编码表就是ASCII表,用来表示英文;ASCII码值的意思就是指的,你表示的一个字符在内存当中存储的时候对应的那个整形值(用二进制存储原创 2022-03-21 08:51:37 · 3359 阅读 · 68 评论 -
C++入门(五)之STL简介
1. 什么是STL STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 2. STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖。 P.原创 2022-03-19 19:02:44 · 180 阅读 · 1 评论 -
C++入门(四)之模板初级
C语言为什呢不提供各种数据结构呢?因为它不支持泛型编程,不支持泛型编程就意味着你写出的一个栈就只能存int原创 2022-03-14 10:57:18 · 370 阅读 · 29 评论 -
C++入门(三)之内存管理
C/C++内存分布C/C++中程序内存分布ps: y以下内存是以32位程序下,linux系统讨论这块叫进程虚拟地址空间(大约4G),每个程序都有这个空间,哪块要存数据,就要跟物理内存(电脑的实际内存)进行建立映射。平时在程序里看到的地址都是这块空间的地址,程序用那块,他就会建立那块的映射栈,静态区,常量区,这块的空间的生命周期都是自动控制的堆:程序运行过程中按需求,申请和释放空间,比如我们实现链表,数组栈等等,都是在堆开空间。堆这块空间的生命周期是手动控制的。关于原创 2022-03-13 18:04:23 · 3517 阅读 · 29 评论 -
C++入门(二)之类与对象
一、面向过程和面向对象初步认识 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 以设计一个外卖系统为例进行理解面向过程:关注下单,接单,送餐这些过程。体现到代码层面就是--方法/函数面向对象:关注实现类对象及类对象间的关系,用户,商家,骑手以及他们之间的关系。体现到代码层面--类的设计及类之间的关系C++ 基于面向对象:面向对象和面向过程混编 原因:C++兼.原创 2022-03-09 21:38:53 · 3729 阅读 · 9 评论 -
C++入门(一)之基础知识点
C++入门 C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机,20世纪80年代, 计算机界提出了OOP(objectorientedprogramming:面向对象)思想,支持面向对象的程序设计语言应运而生。 1982年,BjarneStroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:...原创 2022-03-01 18:58:08 · 2587 阅读 · 6 评论