自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(48)
  • 收藏
  • 关注

原创 C++详解:stack和queue

摘要: 本文详细介绍了C++中三种常用容器适配器的使用与实现方法。主要内容包括:1.stack(栈)的基本操作与基于vector的模拟实现;2.queue(队列)的功能介绍及基于list的实现;3.priority_queue(优先级队列)的原理解析及其堆结构的模拟实现。文章还对比了三种容器的特性,如stack的LIFO(后进先出)特性、queue的FIFO(先进先出)特性,以及priority_queue基于堆的自动排序功能,并提供了完整的代码实现示例,包括向上/向下调整算法等关键操作。

2025-11-09 21:27:36 713

原创 C++详解:list

本文主要介绍了C++中list容器的基本使用方法和特性。list是一个双向链表结构,支持多种构造方式(空构造、带初始值构造、区间构造等),提供了begin/end、rbegin/rend等迭代器操作方法。文章详细说明了list的容量查询(empty/size)、元素访问(front/back)以及修改操作(push/pop/insert/erase等)。特别指出list的sort方法效率问题,建议大数据量时避免使用。最后探讨了迭代器失效问题(仅删除操作会导致失效),并给出了list的模拟实现代码,包括节点结

2025-11-09 21:27:27 905

原创 C++:详解string类

本文摘要: C++11的auto关键字用于自动类型推导,但有一些限制:不能用于函数参数、数组声明,且同一行多个变量声明必须类型一致。范围for循环简化了容器遍历,底层实现基于迭代器。 string类常用接口包括: 构造方法:空构造、C字符串构造、拷贝构造等 容量操作:size()/length()、reserve()、resize() 访问遍历:operator[]、迭代器(begin/end) 修改操作:push_back、append、operator+= 其他功能:find、substr、c_str等

2025-10-11 09:57:27 1031

原创 C++:详解vector类

vector()(重点) 无参构造vector(size_type n, const value_type& val = value_type())构造并初始化n个val(重点) 拷贝构造使用迭代器进行初始化构造。

2025-10-11 09:56:19 835

原创 C++:详解内存管理和模板

本文主要介绍了C++内存管理和模板相关的重要概念。在内存管理方面,详细讲解了C++内存分布(栈、堆、数据段、代码段等)、new/delete操作符的使用(包括内置类型和自定义类型)、operator new/delete函数原理,以及malloc/free与new/delete的关键区别(如初始化处理、类型安全等)。在模板方面,阐述了函数模板的概念、定义格式、实例化方式(隐式/显式)和匹配原则,并介绍了类模板的定义和使用方法。文章通过代码示例和图示,系统性地讲解了这些C++核心特性的底层原理和实际应用场景。

2025-09-14 17:08:07 1182

原创 C++:详解类和对象(二)

• 当运算符被⽤于类类型的对象时,C++语⾔允许我们通过运算符重载的形式指定新的含义。C++规定类类型对象使⽤运算符时,必须转换成调⽤对应运算符重载,若没有对应的运算符重载,则会编译报错。• 运算符重载是具有特殊名字的函数,他的名字是由operator和后⾯要定义的运算符共同构成。和其他函数⼀样,它也具有其返回类型和参数列表以及函数体。• 重载运算符函数的参数个数和该运算符作⽤的运算对象数量⼀样多。

2025-09-14 17:07:53 586

原创 Linux_基础指令(二)

语法: cp [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录功能: 复制⽂件或⽬录说明:• cp指令⽤于复制⽂件或⽬录• 如同时指定两个以上的⽂件或⽬录,且最后的⽬的地是⼀个已经存在的⽬录,则它会把前⾯指定的所有⽂件或⽬录复制到此⽬录中常⽤选项• -f 或 --force 强⾏复制⽂件或⽬录, 不论⽬的⽂件或⽬录是否已经存在• -i 或 --interactive 覆盖⽂件之前先询问⽤⼾• -r 递归处理,将指定⽬录下的⽂件与⼦⽬录⼀并处理。

2025-09-13 18:28:58 1181

原创 C++:详解类和对象(一)

• class为定义类的关键字,Date为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。• 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如成员变量前⾯或者后⾯加_ 或者 m开头,注意C++中这个并不是强制的,只是⼀些惯例,具体看公司的要求。

2025-09-13 18:27:50 886

原创 Linux_基础指令(一)

本文介绍了Linux系统中常用的基础命令及其功能。主要内容包括:ls指令用于查看目录和文件信息,支持多种选项如-a、-l等;pwd命令显示当前工作目录;cd指令用于切换目录,解释了绝对路径和相对路径概念;touch指令可创建新文件或修改文件时间;mkdir和rmdir分别用于创建和删除目录;rm命令可删除文件或目录,支持递归删除;最后介绍了man命令用于查询命令帮助文档。这些基础命令是Linux系统操作的核心,掌握它们对日常文件管理和系统操作至关重要。文章通过具体示例演示了各命令的用法,帮助读者快速理解。

2025-07-19 11:21:55 764

原创 C++入门基础篇(二)

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间。它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头。类型&引⽤别名=引⽤对象。C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<<和>>,这⾥引⽤也和取地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以。(吐槽⼀下,这个问题其实挺坑的,个⼈觉得⽤更多符号反⽽更好,不容易混淆)

2025-07-11 22:44:39 1099

原创 C++入门基础篇(一)

•定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对}即可,}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。•namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。•C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。

2025-07-09 21:42:35 815

原创 C语言实现数据结构:堆排序和二叉树_链式

用C语言代码手动实现构造一棵二叉树,将数据类型转化成char...

2025-05-04 22:14:59 536

原创 比STL更透彻:用C语言造轮子实现队列/栈,彻底搞懂内存操作

int top;//定义队列结点的结构}QueueNode;//定义队列的结构}Queue;

2025-04-19 11:57:56 423

原创 C语言实现数据结构:二叉树_堆

/堆的结构int size;}HP;int c = *x;*x = *y;*y = c;//向上调整算法elsebreak;//插入数据");exit(1);//判空//求size//向下调整算法child++;elsebreak;//删除堆顶数据assert(!//获取堆顶数据assert(!

2025-04-19 11:57:27 1024

原创 带头双向循环链表:数据结构中的‘全能选手’,你掌握了吗?

带头双向循环链表实战:手把手教你实现复杂数据结构!

2025-02-24 11:27:14 240 2

原创 单链表入门到精通:一篇搞定所有核心操作!

从零开始,彻底掌握数据结构中的‘链条艺术’

2025-02-24 11:26:54 519 7

原创 顺序表:数据结构的基石,你真的懂了吗?

初学者必备,手把手教你实现顺序表

2025-02-13 10:07:04 424

原创 数据结构:算法复杂度

前言数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。没有一种单一的数据结构对所有用途都有用,所以我们要学各式各样的数据结构,如:线性表、树、图、哈希等算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

2025-02-08 23:57:06 1187 3

原创 C语言:内存函数

函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。这个函数在遇到’\0’的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的。例子:如果想要拷贝前两个我们也可以通过调整地址来拷贝我们想要的结果。memcpy函数的模拟实现我们来看一个现象上面的例子说明memcpy函数只负责处理内存不重叠的情况,

2024-12-23 18:28:21 639 2

原创 C语言:字符函数和字符串函数

C语言中有一系列的函数是专门做字符分类的,也就是一个字符是属于什么类型的字符的。这些函数的使用都需要包含如图:islower 是能够判断参数部分的c是否是小写字母的。来看练习:练习:写一个代码,将字符串中的小写字母转大写,其他字符不变。

2024-12-23 17:13:28 1141 1

原创 C语言:详解指针最终篇(3)

在指针的类型中我们知道有一种指针类型为char*。一般我们这样使用:我们来看另一种使用方式:这个就相当于,收地址加上方括号下标就可以访问该表达式中对应下标的元素。,所以把常量字符串赋值给p是把首字符的地址赋值给它的。这个时候ps是不能改的运行的程序会崩掉的,我们通常加上const限制的是*ps。当我们先要打印该字符串给它的起始地址就行了。我们来看一道题打印结果:这里str3和str4指向的是一个。C/C++会把常量字符串,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。

2024-12-15 12:48:32 1127

原创 C语言:手把手教你深入理解指针(2)

我们来看例子:我们发现数组名和数组首元素的地址打印出的结果一模一样,我们先来理解下面一段代码的意思:从上面可知输出的结果是:40,如果arr是数组首元素的地址,那输出应该的应该是4/8才对。1.sizeof(数组名),sizeof中单独放数组名,这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)除此之外,任何地方使用数组名,数组名都表示首元素的地址。

2024-12-15 10:14:36 758 1

原创 深入理解指针

这个时候即使出问题断言也不会有反应了。加上#define NDEBUG 指令,然后,重新编译程序,编译器就会禁用文件中所有的 assert()语句。如果程序又出现问题,可以移除这条#define NDEBUG 指令(或者把它注释掉),再次编译,这样就重新启用了 assert()语句。assert()的缺点是,因为引入了额外的检查,增加了程序的运行时间。

2024-12-14 17:17:05 1201 5

原创 C语言:深入理解指针(1)

在讲内存和地址之前,我们想有个生活中的案例:假设有一栋宿舍楼,把你放在楼里,楼上有100个房间,但是房间没有编号,你的一个朋友来找你玩,如果想找到你,就得挨个房子去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给每个房间编上号,如:1 一楼:101,102,103…2 二楼:201,202,203…3…有了房间号,如果你的朋友得到房间号,就可以快速的找房间,找到你。生活中,如果把上面的例子对照到计算机中,又是怎么样呢?

2024-12-01 09:31:51 1069 8

原创 C语言:操作符详解2

我们来看例子使用逗号表达式也可以用来解决以下场景。

2024-11-24 20:14:16 1075 6

原创 C语言:操作符详解1

16进制的数字每一位是0~9, a~f 的,0~9, a~f的数字,各自写成2进制,最多有4个2进制位就足够了,比如f的二进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算一个16进制位,剩余不够4个二进制位的直接换算。7的数字,各自写成2进制,最多有3个2进制位就足够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。其实10进制的每一位是。

2024-11-23 19:56:04 928 2

原创 C语言:文件操作2(又一万字?)

关于文件操作这章内容,因为知道内容较多所以我分两篇发了,但是还是没料到第二篇还是这么多,达到了一万多字!!!

2024-11-10 20:05:04 1071 5

原创 C语言:文件操作1

磁盘(硬盘)上的文件是文件。程序文件、数据文件(从文件功能的角度来分类的)。

2024-11-09 17:37:50 994 4

原创 C语言:动态内存管理【下】

1 .栈区(stack) :在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。2 .堆区(heap) :一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS(操作系统)回收。分配方式类似于链表。3 .数据段(静态区) :(static )存放全局变量、静态数据。程序结束后由系统释放。

2024-10-30 22:28:30 765 1

原创 C语言:动态内存管理【上】

这个函数,并指向这块空间的。.如果开辟成功,则返回一个指向开辟好空间的指针。.如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。.返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。· 如果参数size为0,malloc的行为是标准是未定义的,取决于编译器。。灵活 — 容易出错。

2024-10-30 22:26:31 1031 2

原创 自定义类型:联合和枚举【下】

就是有些数据它取值是有限的,那我们就可以用。

2024-10-27 08:22:55 497

原创 自定义类型:联合和枚举【上】

自定义类型:数组,结构体,联合体,枚举。前面一些我们已经讲过了,接下来我们讲。

2024-10-27 08:01:54 721 1

原创 自定义类型:结构体【下】

根据上面的规则,开始时因为成员a为char类型的给它一个字节的空间,一个字节是8个比特位,但是要占3个比特,但是它是从左边开始还是从右边开始是不确定的,我们假设是从右边开始,当到b成员时,它要占4个字节,这个时候一个字节中还剩1个比特位,到c成员,我们这个一个比特位到底要不要给它也是不确定的,假设浪费掉,c成员是char类型所以打印再为它开辟一个字节的空间,放完c还剩3个比特不够放d,再浪费掉,再开辟一个字节放d。,我们最大对齐数为4,9并不是4的整数倍,它会往下浪费空间,直到是4的倍数12。

2024-10-19 20:06:39 1079 2

原创 自定义类型:结构体【上】

结构是一些值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量。

2024-10-15 22:11:20 911 2

原创 数据在内存中的存储【下】

我们常见的浮点数:3.14159,1E10等,浮点数家族包括:float,double, long double类型。浮点数表示的范围:float.h中定义。之前我们说过浮点数在内存中无法精确保存,那为什么呢?,它跟我们将要讲的这个章节有很大关系。浮点数在内存中到底是怎么存储的,我们先看一个练习。先看结果。说明:整型在内存中的存储方式和浮点数在内存中的存储方式是不一样的。

2024-10-13 11:21:56 922 5

原创 数据在内存中的存储【上】

其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。上述概念需要记住,方便分辨大小端。看图我们这样用16进制形式来进行方便展示,实际上在内存中数据是以二进制存储的。

2024-10-04 19:06:40 1653

原创 VS编译器实用调试技巧

当我们发现程序中存在的问题的时候,那下一步就是找到问题,并修复问题。这个找问题的过程叫称为调试,英文叫debug(消灭bug)的意思。调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所的位置,然后确定错误产生的原因,再修复代码,重新测试。调试是一个动作,找问题的过程,找到这个问题之后解决问题,消灭这个问题。当我们准备调试的时候我们了解一下Debug和 Release。

2024-10-03 19:52:30 1670

原创 C语言数组探秘:数据操控的艺术【下】

承接上篇,我们继续讲数组的内容。

2024-09-27 09:03:26 1371 2

原创 C语言数组探秘:数据操控的艺术【上】

在C语言中数组是非常重要的,应用也是非常广泛的,它可以帮助我们更好的写代码,来解决问题。欧克,开始今天的数组的章节。

2024-09-23 22:39:24 1241 2

原创 C语言内容函数大揭秘:轻松掌握,编程无忧(下)

上面这是我们常规的代码。当我们把函数放到主函数后面的时候,文件从头往下执行的时候没有发现该函数,所以会报警告,但是它也能产生正确的打印结果。先声明后使用。我们可以这样做,看下面的代码:上面的函数的声明,函数的调用,函数的定义这三个地方的名字和参数要一样的,当我们这样写的时候就不会报错了。注意:函数的定义也是一种特殊的声明,当我们把它放在函数调用前面的时候,就不用声明了,当我们将函数定义放在函数调用后面的时候,要在函数调用前面放上函数声明,其实只要在它使用前面就行,也可以在主函数中。

2024-09-20 21:45:17 1273

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除