自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux:五种IO模型

本文介绍了五种I/O模型的理论概念,重点分析了非阻塞I/O和多路转接I/O模式。文章通过钓鱼的生动比喻,阐述了阻塞I/O、非阻塞I/O、信号驱动I/O、多路检测I/O和异步I/O的区别。详细讲解了select、poll和epoll三种多路转接技术的实现原理和代码示例,比较了它们的优缺点。特别深入分析了epoll的水平触发(LT)和边缘触发(ET)两种工作模式,指出ET模式必须配合非阻塞I/O使用才能发挥最佳性能。通过理论讲解和代码实现相结合的方式,全面展示了Linux系统下高效I/O处理的实现方法和技术演进

2025-12-27 15:35:24 828

原创 Linux:NAPT等其他补充内容

首先当web客户端请求服务器时,如果是TCP协议则必须先进行三次握手的链接建立,客户端发送带有SYN的TCP请求报文,该报文里除了会将SYN标志位置为1,还会携带上源端口,目的端口,以及32位确认序列号,并携带上自己的16位窗口大小,为后续滑动窗口进行流量控制做铺垫,但因为SYN请求是不需要携带数据的,所以只有报头大小的20字节。假设没有反向代理服务器,当多个服务器请求同时发起访问,假设服务器出现问题,让所有请求都只请求其中一个服务器,那么就构成了旱的旱死,涝的涝死的场面,最终可能会导致服务器崩溃挂掉。

2025-12-02 13:28:19 477

原创 Linux:数据链路层

本文介绍了数据链路层MAC帧报文的关键要素和工作原理。MAC地址由48位二进制组成,用于标识收发双方;类型字段区分上层协议(如0x0800为IP)。MAC帧包含14字节固定报头,数据段46-1500字节,尾部4字节CRC校验。以太网通过MTU(1500字节)限制数据大小,TCP/UDP最大有效载荷分别为1460/1472字节。局域网采用共享信道机制,通过ARP协议实现IP到MAC地址的转换:当未知目标MAC时,发送广播ARP请求,目标主机以单播ARP响应回复。这种机制解决了IP报文在链路层传输时的地址转换问

2025-11-27 22:17:42 988

原创 Linux:IP协议

摘要:Linux网络层中IP协议与传输层的核心区别在于可靠性保证。IP协议作为网络层协议,提供"尽力交付"的无连接传输能力,通过IP地址实现主机间通信定位,但不保证传输绝对可靠。传输层TCP协议则通过确认重传机制确保100%可靠传输。IP地址采用"网络号+主机号"结构,结合子网掩码实现子网划分,提高寻址效率。路由器通过路由表实现跨子网转发,NAT技术解决私有IP与公网通信问题。IP报文分片通过16位标识、3位标志和13位片偏移字段实现重组,但分片会增加丢包风险,建议由

2025-11-26 00:02:17 752

原创 Linux:TCP协议

本文深入解析了TCP协议的核心机制。文章首先介绍了TCP报文结构,重点分析了4位首部长度、32位序列号和确认序列号的作用,以及TCP面向字节流的特性。随后详细阐述了TCP的可靠性保证机制,包括应答机制、超时重传和滑动窗口技术。文章还深入探讨了TCP连接的建立与释放过程,解释了三路握手和四次挥手的必要性及状态转换,特别分析了TIME_WAIT状态的作用。最后讨论了拥塞控制策略,包括慢启动、拥塞避免和快速恢复等算法,揭示了TCP如何通过动态调整发送速率来平衡网络利用率和稳定性。全文系统性地梳理了TCP协议的各个

2025-11-16 14:26:55 1252 1

原创 Linux:UDP协议

本文解析了UDP协议的关键特性与实现机制。UDP作为传输层协议,具有无连接、不可靠但高效的特点,适用于音视频等实时传输场景。文章详细说明了UDP报文结构(包含源/目的端口、长度和检验和字段)及工作原理,指出其面向数据报的传输方式与TCP面向字节流的本质区别。同时解释了操作系统通过sk_buff结构体管理网络数据包的核心机制,实现协议栈各层的"零拷贝"处理。文中还解答了端口绑定、报文处理等网络编程常见问题,阐明了UDP协议在特定应用场景中的优势。

2025-11-05 00:02:38 868

原创 Linux:探究HTTP协议

本文深入解析HTTP协议及其实现原理,主要内容包括:1)HTTP协议基础:定义其为超文本传输协议,规范客户端与服务器的交互方式,支持多种资源传输;2)技术实现细节:探究基于Socket的通信机制,分析请求/响应报文结构,包括请求方法、状态码、重定向等核心要素;3)高级特性:阐述长短连接、Cookie/Session等安全机制;4)实践应用:呈现一套完整的C++ HTTP服务器实现方案,涵盖日志系统、套接字封装、请求处理等模块。通过理论解析与代码实现相结合,全面揭示HTTP协议的工作原理和应用方法。

2025-11-01 20:29:51 1137

原创 Socket基础

本文介绍了Linux网络编程中的Socket理论和实践应用。Socket作为进程间通信的手段,通过IP+Port标识全网唯一的网络进程。文章详细讲解了TCP/UDP协议的区别、端口号概念、大小端存储问题及Socket API接口。重点实现了一个简易英译中翻译器(UDP协议)和一个简单聊天室(TCP协议),包含服务器和客户端代码设计。其中TCP服务器采用多线程处理客户端连接,实现并发服务。最后介绍了Linux网络状态查看命令netstat的使用。文章通过具体项目展示了Socket编程的核心概念和实际应用,帮助

2025-09-23 13:26:17 1697

原创 Linux:初识网络

本文介绍了Linux网络基础概念,重点阐述了TCP/IP协议的分层架构和通信原理。主要内容包括:1. 网络产生背景及其发展的三个阶段;2. 协议分层的必要性,对比OSI七层和TCP/IP四层模型;3. 局域网通信机制,包括MAC地址作用和以太网工作原理;4. 数据封装与解封装过程,说明各层报头的作用;5. 跨网络传输流程,区分IP地址的全局定位和MAC地址的本地转发功能。文章通过分层思想揭示了网络协议设计的核心逻辑,体现了TCP/IP模型"上层不依赖下层实现"的解耦价值。

2025-09-05 00:42:47 791

原创 Linux:线程同步与互斥

本文深入探讨了Linux线程同步与互斥机制。通过抢票案例揭示了多线程并发访问共享资源导致的数据不一致问题,指出关键原因在于非原子性操作和临界区未保护。详细介绍了互斥锁(pthread_mutex_t)的实现原理和使用方法,包括锁的硬件/软件实现机制。针对线程饥饿问题,引入同步概念和条件变量(pthread_cond_t),阐释了生产者-消费者模型的核心要素和三种关系(生产者间互斥、消费者间互斥、生产消费间同步互斥)。最后通过阻塞队列Demo代码展示了具体实现,重点说明为何使用while而非if判断队列状态以

2025-08-21 01:28:46 1065

原创 Linux:线程

本文深入探讨了Linux线程的实现机制。Linux采用轻量级进程模拟线程,通过共享地址空间实现资源高效共享。线程控制块(TCB)由用户态线程库管理,包含线程ID、状态等信息。文章详细解析了线程创建(pthread_create)、终止(pthread_exit)、等待(pthread_join)等操作原理,以及线程分离(pthread_detach)机制。特别指出Linux线程ID实质是线程控制块地址,并对比了用户级线程ID与内核LWP的区别。通过分析页表管理、地址转换等底层机制,揭示了线程资源共享的本质是

2025-08-13 17:51:20 1033

原创 Linux:信号

本文深入解析了Linux系统中的信号机制。信号是进程间异步通信的一种方式,本质是事件通知(如Ctrl+C触发SIGINT)。文章详细阐述了信号的产生方式(键盘、系统调用、硬件异常等)、处理流程(默认/忽略/自定义)和保存机制(通过PCB中的pending/block/handler三张表)。重点分析了信号递达的时机——当进程从内核态返回用户态时,操作系统会检查并处理待决信号。通过代码示例演示了信号阻塞和自定义处理的实际应用。文章还从硬件中断角度解释了信号底层原理,包括中断控制器、IDT表等核心概念,揭示了用

2025-08-06 16:56:54 916

原创 Linux:进程间通信

本文深入探讨了进程间通信(IPC)的两种主要机制:管道和SystemV共享内存。管道分为匿名管道(用于父子进程通信)和命名管道(支持无血缘关系进程通信),其本质是让不同进程看到同一内存资源,但存在单向通信和同步问题。SystemV共享内存则通过映射同一物理内存实现高效数据共享,但缺乏同步机制可能导致数据不一致。文章详细介绍了相关系统调用(pipe、mkfifo、shmget等),通过代码示例演示了实现方法,并分析了生命周期、权限控制等特性。最后引入信号量概念,解释了如何通过原子操作解决共享资源的同步问题,介

2025-07-24 15:06:29 1063

原创 Linux:库的原理

所以ELF文件从磁盘加载进入内存时,将ELF文件里的每一个segment加载进内存,而ELF又已经经过绝对编址,所以每一个segment上面都拥有虚拟地址,所以用每一个segment的起始与结束的地址来初始化,PCB里mm_struct中每一个vm_area_struct里的start与end,然后构建页表映射关系,然后把ELF Header里的 Entry_point_address的地址喂给cpu,cpu就能通过通过MMU进行自动查找虚拟地址与物理地址的映射位置,就能运行代码转起来。

2025-07-10 22:13:28 1056 1

原创 Linux:库的制作

头文件的制作实际上是对源文件中方法的说明文档。所有的库(无论静态还是动态),本质上都是源文件(.c)对应的.o 文件。所以,对于库而言,其本质就是将所有的.o 文件打包。这个包就是.a 文件,.a 静态库本质上是对所有.o 文件进行归档,使用者无需进行解包,可直接使用 gcc/g++ 进行链接。静态库的要求是文件以.a 结尾,以 lib 开头。假设我们是库的使用者,若要使用刚刚的库,就需要下载打包好的库。下图模拟了用户下载并解压库的过程。

2025-07-07 13:39:11 502

原创 Linux:文件系统

这里我们要想,如果GDT,inode table这些区域里的数据出现了问题,其实也还好,可能只是损害了几个G的问题,但是如果SuperBlock出现问题,那么整个分区的将会崩,所以当SuperBlock出现问题,就会从其他存放SuperBlock组里进行拷贝恢复数据。在Linux中要管理一个300GB的磁盘内存,就只需要再把300GB的内存进行再次分治为一个个块组,就转化成对一个个块组进行管理,块组里面就存放着许多数据块,这些数据块就是用来存放各种数据的,而一个块的大小就是4KB。这样效率是不是会非常慢。

2025-07-03 15:13:27 872

原创 C++:Hash拓展--布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,主要用于快速判断一个元素是否“可能存在于”一个集合中,或者“绝对不存在于”集合中。N为传入的数据大小,X为倍数,用于求出M,K为模板类型,剩下的就是哈希函数。假设我们现在需要查找名字为胡歌,此时就存在Hash冲突,胡歌明明没有插入数据,但显示已经在布隆过滤器里了,存在误判。若返回“可能存在”,则大概率是重复URL(即使有小概率误判是新URL,放弃抓取也是可以接受的代价)。该函数为布隆过滤器核心,当有一个不在就是不在,这个是准确的。

2025-06-18 23:27:14 961

原创 Hash拓展——位图

我们用每一个bit去相对映射一个数字,当该bit位为1时,表示这个数字存在,当bit位为0时,表示这个数字不存在。实现海量数据的高效存储与查询: 每个 bit 位对应一个数值的存在状态(1 表示存在,0 表示不存在) 典型存储单位:1 个 int(32bit)可映射 32 个数值的状态。用于检查x是否存在,进行按位& 1运算, 1&1 = 1 1& 0 =0。除模法,i用于确定在哪一个元素里,j用于算在该元素里的第几个bit位。因为 1|0 = 1 0|0 =0,就成功该bit位置位1。

2025-06-17 20:28:06 703

原创 力扣:基本计算器

摘要:本文介绍了实现基本计算器的算法思路,通过中缀表达式转后缀表达式(逆波兰表达式)的方法进行运算。关键步骤包括:处理空格和负数、优先级判断、递归处理括号子表达式、后缀表达式求值等。文中分享了实现过程中的常见问题:负数与减号的区分、特殊括号情况处理、调试输出影响性能等,并提供了C++代码实现方案。该算法能够正确处理复杂表达式运算,如"(1+(4+5+2)-3)+(6+8)"等情形。

2025-06-12 19:52:19 796

原创 C++11下(智能指针)

上图就是用RAII思想创建的简单智能指针,当我们new了一个对象进来后,由我们的指针进行接受,并初始化成员变量_ptr指向堆空间new的那块区域。如果是p1申请空间失败还好说,并不会出事,怕的就是p1申请空间成功,而p2申请空间失败,此时抛出异常程序结束。std::weak_ptr 是 C++ 智能指针家族中的一员,但它不支持RAII,属于弱指针,专门设计用来解决 std::shared_ptr 的。unique_ptr是以类模板的方式实现的删除器,如果是仿函数,只需要传仿函数类型即可,但是要显示实例化。

2025-06-07 01:45:13 796

原创 C++11(中)

C++11 引入的可变参数模板(Variadic Templates)是模板编程的重大革新,允许模板接受任意数量、任意类型的参数,极大提升了代码的泛化能力,并且也支持左值引用传参与右值引用传参。主要使用场景为,当我们自定义类型时,需要针对不同情况进行不同的排序,如果专门写个仿函数比较,感觉有点重,但如果是使用Lambda时,就显得很方便别人看也很易懂。在循环判断时,我们用count函数,count函数会用str字符串去查早map里是否有匹配的string字符,如果有则返回其存在的数量,如果没有则返回0。

2025-06-04 01:01:05 706

原创 C++11(上)

第一段代码还好,仅仅只是返回一个string,而第二段代码需要返回的是vector的vector,传值返回就需要创建相同的临时变量,通过临时变量在进行拷贝构造,代价是非常大的。可以看到i,调用的是左值引用,ci是const左值引用,3因为是一个常量所以也是const 左值引用,当move了i后,i属性变为右值,但const 左值引用以及可以引用右值,所以程序能正常运行。不要忘记之前说的,当一个右值引用的变量绑定了一个右值后,该变量的属性依旧为左值,所以编译器这里把x识别为左值,调用的就是左值引用的f函数。

2025-06-01 00:13:47 989

原创 C++:二叉搜索树

如上图需要删除4,我们去寻找4的右子树的最左节点也就是5。一颗树的右子树的最左节点与一颗树的左子树的最右节点,是仅大于该子树的根或仅小于该子树根的节点。比如上图删除6节点,因为6节点的左子树为空,所以我们只需要将6节点的父亲及4节点的right链路6节点的右边,不需要管6是否有又节点。如上图,当我们需要删除4节点的时,因为4拥有左右子树,不能简单直接删除,会破坏二叉搜索树的特性,因此我们需要使用替代法。

2025-05-14 20:21:45 741

原创 Linux:进程控制

替换后,新程序会占用原进程的资源,包括进程 ID、打开的文件描述符等,但会拥有全新的代码段、数据段和堆栈段,原进程的代码和数据将被完全覆盖。进程等待是指进程在执行过程中,由于某些条件不满足而暂时停止执行,进入一种等待状态,直到所等待的事件发生或条件满足后,才会再次被唤醒并继续执行。用于进程管理的系统调用函数。在本篇文章中,我将带领大家来深入浅出的认识进程控制的概念,包括进程退出,进程等待,以及进程替换等知识。程序替换简单来说,就是进程在执行代码的过程中,替换原有的代码和数据,但不会替换进程的其他数据。

2025-04-21 21:33:37 922

原创 Linux:进程地址空间

从上图输出可以看到,我们的子进程继承了父进程的全局变量val,当子进程中的val产生了修改时,父进程的val值并没有变化,但父子进程在打印val的地址时,会发现val的地址是一样的。但这不就冲突了吗,我们知道地址是唯一的,一段相同的地址可以同时打印不同的值,这并不符合我们之前理解的概念。”这个机制的工作原理是:如果子进程想修改某段数据,操作系统会先在内存中找一块新的空地,把需要修改的数据复制到这块新地方,然后更新子进程的“门禁卡”(页表),让它指向这个新的地址。但是对于大饼,大饼同样也需要管理。

2025-04-09 19:26:41 937

原创 Linux:环境变量

如果我们输入echo $PATH命令,会看到多个由冒号分隔的路径(例如/usr/bin:/bin:/usr/local/bin等)。上图我们通过 file /usr/bin/ls 来输出ls命令的属性,可以看到ls也是用c语言写的程序,所以我们在使用ls -a或ls -l 时候程序都会对传入的的命令进行命令行分析,来决定输出的文件形式。,一张命令行参数表,一张为环境变量表。上图可以看出,argc代表的是传入了多少个命令行参数,而argv则是传入的命令行参数,而我们在命令行上输入的内容都会存入argv中。

2025-04-02 15:38:43 1242

原创 Linux:进程切换与调度总结

通过上文理解后,修改进程优先级是通过调整Nice值而不是直接修改Priority值,原因包括:

2025-02-18 00:54:02 1152

原创 Linux:进程状态总结

在PCB中有一个struct结构体,我们先暂称为list_head,这个结构体里就存放着prev和next,然后next就指向下个PCB的next,prev就指向上个PCB的prev,而不是指向首字节,对于为什么要这么操作,是因为在操作系统在,task_struct里存放着许多list_head。所以通过上图的理解,对进程状态的管理,其实就可以转化为对链表的管理,进程的状态变化,本质是在不同的队列中进行流动,本质都是对数据结构的增删查改。所以在操作系统中,一个进程的结构体,可以同时属于多种类型的数据结构。

2025-02-15 15:37:09 872

原创 Linux:进程概念详解

分析上图代码,一开始我们输出当前进程的PID和PPID,接着通过fork进行创建子进程后再次打印PID和PPID,我们会发现此时除了第一条打印的语句我们理解,还多了一条打印的语句。并且观察PID,会发现PID为 19215 的PPID正是一开始打印的PID 19214,那么就能够证明了fork会创建子进程,并且子进程会继承父进程fork()之后的代码,所以会打印两句输出语句。通过上图运行可以看到,我们一直运行mycode的文件时,它的PID是依次递增的,但一直不变的是PPID。但进程并非仅仅是数据和代码。

2025-02-15 01:05:58 765

原创 C++进阶:Hash表总结及模拟实现unordered_map与unordered_set

简单来说,哈希表就是将一些没有规律的值存储在一段有序的区间内,通过哈希函数将数据映射到这个区间中的某个位置,从而实现快速查找。在C++中unordered_map与unordered_set底层都使用的是哈希表,所以对unordered_map与unordered_set封装本质上也是是对哈希表的更上层的封装,以及对原哈希表结构进行优化处理。如果关键字是 [a, z] 的小写字母,我们可以开一个大小为 26 的数组,每个字母的 ASCII 码减去 a 的 ASCII 码就是数组的下标。

2025-02-04 16:06:25 518

原创 C++进阶: 红黑树及map与set封装

红黑树整理与AVL树类似,但在对树的平衡做控制时,AVL树会比红黑树更严格。AVL树是通过引入平衡因子的概念进行对树高度控制。红黑树则是对每个节点标记颜色,对颜色进行控制。

2025-02-02 18:20:21 754

原创 Linux:初识进程

分析上图代码,一开始我们输出当前进程的PID和PPID,接着通过fork进行创建子进程后再次打印PID和PPID,我们会发现此时除了第一条打印的语句我们理解,还多了一条打印的语句。并且观察PID,会发现PID为 19215 的PPID正是一开始打印的PID 19214,那么就能够证明了fork会创建子进程,并且子进程会继承父进程fork()之后的代码,所以会打印两句输出语句。gval是一个全局变量,父子进程都可以看到,当我们fork之后,子进程会开始对gval值进行修改,而父进程只对gval值进行查看。

2025-01-13 09:51:53 759

原创 Linux:操作系统简介

在本片文章,小编将带大家理解冯诺依曼体系以及简单理解操作喜欢,并且本篇文章将围绕什么以及为什么两个话题进行展开说明。

2025-01-11 15:52:43 831

原创 C++进阶:AVL树

一:AVL树的介绍一:AVL树的介绍AVL树(Adelson-Velsky and Landis树)是一种自平衡的二叉搜索树(BST),它通过在每个节点维护一个平衡因子,确保树的高度差不超过1,从而使得树的操作(如查找、插入和删除)的时间复杂度保持在 O(log⁡n) 的水平。因为我们在普通的二叉树插入的时候,也许会出现下图这种极端的情况:那么如果此时搜索5或4的时候时间复杂度就为O(N)。那么为了解决这种情况苏联的两位数学家就发明了AVL树。在AVL树树中有个关键的概念,那就是。

2025-01-05 16:50:13 1080

原创 力扣二叉树题解含思路(C++实现)

这里小编想多一嘴,为什么cur会回到6节点,因为我们采用的方式是递归,递归函数会进行压栈,当我们压入4节点的函数栈帧时候,6节点栈帧会保存在4节点下面,而当4节点函数结束时候,此时函数栈帧进行弹出销毁,6节点就是栈顶,所以此时cur的值就是6.而且因为递归的关系,就算指向改变了也不会影响中序遍历的顺序,因为已经将顺序全部压入栈中了。其实这题如果忽略题目要求就很简单,因为是标准的搜索二叉树,就通过中序遍历存入list题目就解决了,但小编应题目要求,空间复杂度为O(1)及在原树上操作。

2024-11-10 19:20:32 903 1

原创 初见Linux:基础开发工具

前言:这篇文章我们将讲述Linux的基本开发工具,以及讨论Linux的生态圈,最后再了解vim开发工具。Yum:YUM(Yellowdog Updater Modified)是一个在Linux系统中用于管理软件包的工具,特别是在基于RPM(Red Hat Package Manager)格式的发行版上,如Red Hat Enterprise Linux、CentOS和Fedora等。YUM允许用户轻松安装、更新和删除软件包,并自动处理依赖关系。在Linux下安装软件的方法。

2024-11-09 15:01:12 811

原创 初见Linux:权限篇

从上图我们取消了dir目录中拥有者的w权限,接着进入dir,ls后发现dir目录下拥有一个test.txt文件,此时将test.txt文件进行删除发现没有权限。我们可以看到此时用户为dog,test.txt对于dog用户只用r的权限,但从上图dog用户可以直接删除test.txt文件,这是为什么,是不是不符合常理。因此可以排除r权限,那会不会是w权限呢?在Linux中的访问权限中,有三种不同角色的访问权限,分别问拥有者的访问权限,所属组的访问权限,以及other(其他人)的访问权限。很好的做到了用户隔离。

2024-10-28 01:01:56 684

原创 C++:多态

从上图调试信息可以看见,主函数的基类b与派生类的c 和 fun1()里的基类b1与派生类的c1它们的虚函数表指针都是同一个地址,那么就可以断定,虚函数表不是单独存在的,而是对象共用的。接着我们要取虚函数表地址,经过之前的例子我们可以知道存虚函数表是存在于对象的首地址,所以 *((int*)&p)的意思是先&p取到p的地址,然后(int*)&p将p的地址强制转换成int*类型,最后在解引用获取到地址的数值。因为在系统内存中是不会考虑你是什么类型的地址,存的都是二进制的0101,所以只看你的内存地址对不对。

2024-09-27 14:40:49 665

原创 C++:继承

但你总不可能是老师的时候,你的年龄,性别是一套信息,而当你是学生的时候你的年龄性别又是另一套信息,这不符合常理。继承嘛,继承遗产是继承,继承家业也是继承。所以如下图因为老师和学生同时都拥有人的属性,所以通过继承,让老师和学生都继承Person类,就相当于他们都拥有了Person的成员变量,而他们自己的成员变量又是独有的。那么从上图可以看到,创建了一个int类型的b引用去引用a,这里并不是直接引用a而是引用中间的临时变量,而临时变量是具有常性的,所有普通的引用不行,必须有经过const修饰的引用才行。

2024-09-18 11:31:42 852

原创 C++:关于反向迭代器的学习分享

反向迭代器的begin位置对应容器的end位置,反向迭代器的end位置对应容器的begin位置,为了方便理解,下图是一个list的begin位置以及end位置,那么相对于的就是list的反向迭代器的rbegin位置以及rend位置。那么反向迭代器的operator++()与 operator--()函数会调用正向迭代器的operator--()与operator++(),并且内部都是对正向迭代器的函数复用操作。那么反向迭代器的初始化其实就是通过传入的正向迭代器的参数对反向迭代器里的it进行初始化。

2024-09-03 19:16:28 790 1

空空如也

空空如也

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

TA关注的人

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