- 博客(59)
- 收藏
- 关注
原创 C++的STL之空间配置器
空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作。虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助。
2025-04-02 10:31:28
683
原创 C++的IO流
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?使用itoa()函数使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。
2025-04-01 08:11:08
651
原创 C++特殊类设计及类型转换
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。
2025-03-31 07:58:08
939
原创 C++智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1.内存申请了忘记释放// 2.异常安全问题Func();// 这里Func函数抛异常导致 delete[] p3未执行,p3没被释放.
2025-03-30 07:20:28
565
原创 C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:,_id(id){}protected:int _id;public:{}
2025-03-29 08:29:15
624
原创 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个缺陷的修正,
2025-03-28 08:48:56
877
原创 C++哈希拓展
有⼀些场景下⾯,有⼤量数据需要判断是否存在,⽽这些数据不是整形,那么位图就不能使⽤了,使⽤红⿊树/哈希表等内存空间可能不够。这些场景就需要布隆过滤器来解决。布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 ⼀种紧凑型的、⽐较巧妙的概率型数据结构,特点是⾼效地插⼊和查询,可以⽤来告诉你 “某样东西⼀定不存在或者可能存在”,它是⽤多个哈希函数,将⼀个数据映射到位图结构中。此种⽅式不仅可以提升查询效率,也可以节省⼤量的内存空间。
2025-03-27 11:24:37
845
原创 C++哈希
unordered_map在线文档说明unordered_map是存储<key, value>键值对的关联式容器,其允许通过keys快速的索引到与其对应的value。在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。在内部,unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2025-02-20 22:43:09
346
原创 C++map和set
set文档介绍1.set是按照一定次序存储元素的容器2.在set中,元素的value也标识它(value就是key, 类型为T), 并且每个value必须是唯一的,set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们3.在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序4.set容器通过key访问单个元素的速度通常比unordered _set容器慢,但它们允许根据顺序对子集进行直接迭代。
2025-02-19 18:21:44
874
原创 C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为,比如Student继承了Person,Person对象买票全价,Student对象买票半价那么在继承中要构成多态还有两个条件1.必须通过基类都指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2025-01-24 23:10:26
703
原创 C++继承
下面Person是父类,也称作基类,Student是子类,也称派生类1.很多人说C++语法复杂,其实多继承就是一个体现,有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂,所以一般不建议设计出多继承,一定不要设计菱形继承,否则在复杂度及性能上都有问题2.多继承可以认为是c++的缺陷之一,很多后来的OO语言都没有继承,如java3.继承和组合public继承是一种is-a的关系,也就是说每个派生类对象都是一个基类对象。
2025-01-19 20:09:19
911
原创 C++模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式优点1.模板复用了代码,节省资源,更快的迭代开发,c++的标准模板库(STL)因此产生2.增强了代码的灵活性缺陷1.模板会导致代码膨胀问题,也会导致编译时间变长2.出现模板编译错误时,错误信息非常凌乱,不易定位错误。
2025-01-14 19:32:47
1062
原创 C++stack和queue
queue的文档介绍解释:1.队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素,2.队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素,元素从队尾入队列,从队头出队列3.底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类,queue 提供一组特定的成员函数来访问其元素,元素从队尾入队列,从队头出队列empty: 检测队列是否为空。
2025-01-10 20:53:03
868
原创 C++list
1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双相迭代2.list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素3.list与forward_list非常相似:最主要的不同在于forward _list是单链表,只能朝前迭代,已让其更简单高效4.与其他的序列式容器相比(array, vector, deque), list通常在任意位置进行插入,移除元素的执行效率更好。
2025-01-07 18:29:05
679
原创 C++vector
capacity 的代码在vs和g++下分别运行会发现,vs下capacity 是按1.5倍增长的,g++是按2倍增长的,这个问题经常会考察,不要固化的认为,vector 增容都是2倍,具体增长多少是根据具体的需求定义的,vs是PJ版本STL,g++是SGI版本的STLreverse 只负责开辟空间,如果确定知道需要用多少空间,reverse可以缓解vector增容的代价缺陷问题resize 在开空间的同时还会进行初始化,影响size// 测试vector的默认扩容机制size_t sz;
2025-01-05 18:04:36
950
原创 C++模板进阶
class 类模板名// 类内成员定义// 动态顺序表// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具public :, _size(0){}// 使用析构函数演示:在类中声明,在类外定义。~Vector();// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表if(_pData)
2025-01-04 17:44:21
863
原创 C++string类
就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享,父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了。
2025-01-03 19:32:45
923
原创 C++内存管理(C/C++)
int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;free(p5);return 0;
2024-12-30 18:02:38
754
原创 C++类与对象下
在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量的初始化,
2024-12-29 18:29:19
1033
原创 C++类与对象上
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体注意类定义结束时后面分号不能省略类体中内容称为类的成员:类中的变量称为类的属性或成员变量,类中的函数称为类的方法或者成员函数1.声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理2.类声明放在.h文件中,成员函数定义放在.cpp文件中,注:成员函数名前需要加类名::一般情况下,更期望采用第二种方式。
2024-12-27 20:48:46
1081
原创 C++入门
定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接{},{}中即为命名空间成员// bit是命名空间的名字,一般开发中是用项目名字做命名空间名。// 我们上课用的是bit,大家下去以后自己练习用自己名字缩写即可,如张三:zs// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型int val;//2. 命名空间可以嵌套int a;int b;int c;int d;
2024-12-26 17:44:15
923
原创 C++前言
C语言是结构化和模块化的语言,适合处理较小规模的程序,对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言不适合,为了解决软件危机,20世纪80年代,计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。
2024-12-25 18:06:28
1093
原创 数据结构排序
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]=r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的,否则称为不稳定内部排序:数据元素全部放在内存中的排序外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。
2024-12-24 13:16:12
821
原创 数据结构二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个层次关系的集合,把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下注:树形结构中,子树之间不能有交集,否则就不是树形结构。
2024-12-23 17:55:56
1092
原创 数据结构栈和队列
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作,,栈中的数据元素遵守LIFO(last in first out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,出站栈:栈的删除操作叫做出栈,
2024-12-22 15:38:25
836
原创 数据结构顺序表和链表
线性表是n个具有相同特性的数据元素的有限序列,线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串线性表在逻辑上是线性结构的,也就是说连续的一条直线我,但是在物理结构上并不一定是连续的,线性表在物理上存储是我,通常以数组和链式结构的形式存储。
2024-12-21 19:06:57
993
原创 数据结构时间复杂度空间复杂度
算法(Algorithm)就是定义良好的计算过程,它取一个或一组的值为输入,并产生出一个或一组的值作为输出,简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果3.数据结构和算法的重要性。
2024-12-20 23:00:00
1006
原创 C语言贪吃蛇项目
windowszheges多作业系统除了协调应用程序的执行,分配内存,管理资源之外它同时也是一个很大的服务中心,调用这个服务中心的各种服务(每一种服务就是一个函数),可以帮应用程序达到开启视窗,描绘图形,使用周边设备等目的,由于这些函数服务对象是应用程序(Application),所以便称为Application Programming Interface,简称API函数,WIN32API也就是Microsoft Windows32位平台的应用程序编程接口。
2024-12-19 22:00:00
994
原创 C语言单链表、双链表专题及应用
概念:链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的链表的结构跟火车车厢相似,淡季时车次的车厢会相应减少,旺季时车次的车厢会额外增加几节,只需要将火车里的节车厢去掉/加上,不会影响其他车厢,每节车厢都是独立存在的车厢是独立存在的,且每节车厢都有车门,想象一下这样的场景,假设每节车厢的车门都是锁上的状态 需要不同的钥匙才能解锁,每次只能携带一把钥匙的情况下如何从车头走到车尾最简单的做法:每节车厢里都放一把下一节车厢的钥匙。
2024-12-18 22:00:00
944
原创 C语言顺序表专题及应用
数据结构是由“数据”和“结构”两词组合而来。什么是数据?常见的数值1、2、3、4…、教务系统⾥保存的用户信息(姓名、性别、年龄、学历等等)、网页肉眼可以看到的信息(⽂字、图⽚、视频等等),这些都是数据什么是结构?当我们想要使用⼤量使用同⼀类型的数据时,通过手动定义⼤量的独立的变量对于程序来说,可读性非常差,我们可以借助数组这样的数据结构将大量的数据组织在⼀起,结构也可以理解为组织数据的方式。想要找到草原上名叫“咩咩”的羊很难,但是从羊圈里找到1号羊就很简单,羊圈这样的结构有效将羊群组织起来。
2024-12-17 22:00:00
843
原创 C语言预处理详解
1000register//为 register这个关键字,创建⼀个简短的名字for;;//⽤更形象的符号来替换⼀种实现break;case//在写case语句的时候⾃动把 break写上。// 如果定义的 stuff过⻓,可以分成⼏⾏写,除了最后⼀⾏外,每⾏的后⾯都加⼀个反斜杠(续⾏符)。printf# define MAX 1000 # define reg register //为 register这个关键字,创建⼀个简短的名字 # define do_forever for(
2024-12-16 22:00:00
1664
原创 C语言文件操作
磁盘上的文件是文件但是程序设计中,一般谈的文件有两种:程序文件,数据文件(从文件功能的角度来分类的)上面说的适用于所有输入流一般适用于标准输入流和其他输入流(如文件输入流),所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)
2024-12-14 21:27:54
724
原创 C语言动态内存管理
c/c++程序内存分配的几个区域1.栈区(stack):在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放,栈内存分配橼酸内酯处理器的指令集中,效率很高,但是分配内存容量有限,栈区主要存放运行函数而分配的局部变量,函数参数,返回数据,返回地址等2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时os回收,分配方式类似于链表3.数据段(静态区)(static):存放全局变量,静态数据,程序结束后有系统释放。
2024-12-12 22:14:50
954
原创 C语言自定义类型:联合和枚举
联合体由一个或者多个成员构成,这些成员可以不同的类型。但是编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用同一块空间,所以联合体也叫给联合体其中一个成员赋值,其他成员的值也跟着变化。
2024-10-05 09:51:38
741
原创 C语言自定义类型结构体
位段的声明和结构是类似的,但也不全相同1.位段的成员必须是int, unsigned int 或signed int,在c99中位段成员的类型也可以选择其他类型2.位段的成员名后面有一个冒号和数字struct Aint _a:2;int _b:5;int _c:10;int _d:30;解释:a占用2位的整数,b占用5位整数,c占用10位整数,d占用30位整数,一共47位,int类型是32位,所以占用8个字节大小。
2024-10-02 20:08:15
1038
原创 C语言数据在内存中的存储
超过一个字节的数据在内存中存储的时候,就有存储顺序问题,按照不同的存储顺序,分为大端字节序存储和小端字节序存储大端模式,是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处小端模式,是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存到内存的高地址处。
2024-09-30 18:28:04
1228
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅