自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 力扣 148. 排序链表

步骤核心操作目的分快慢指针找中点 + 断开链表把原链表拆成两个独立子链表,降低问题规模治递归排序子链表解决最小子问题(空/单节点链表天然有序)合双指针合并有序链表把有序子结果合并成最终有序链表。

2025-12-29 20:35:43 491

原创 HTTP请求-响应逻辑

整个过程的核心是:服务器通过acceptor监听连接,用socket与浏览器通信,通过 Boost.Beast 解析 HTTP 请求并构建响应,最终将处理结果返回给浏览器。io_context全程负责调度所有异步操作(接受连接、读写数据等),确保整个流程高效非阻塞地执行。

2025-10-25 17:39:09 413

原创 beast::asio读写解析

操作对象async_read作用于socketasync_wait作用于timer,但最终都依赖io_context调度。读写目标socket的读写操作是通过底层套接字与远程端交换数据,数据本身存储在内存缓冲区中。io_context角色:作为 IO 事件的监听者和回调的调度者,是所有异步操作的“引擎”,没有它,异步操作无法触发和执行。理解这一点的关键是:网络编程的核心是“事件驱动”,io_context就是事件的管理者,而socket是事件的载体(数据通过它流动)。

2025-10-25 16:47:00 617

原创 深入理解C++优先队列:从原理到自定义实现

本文深入解析C++优先队列的实现原理,从堆数据结构的基础概念出发,通过自定义基于最小堆的优先队列实现,详细讲解插入、删除等核心操作。内容包括堆的物理存储与逻辑结构映射、上浮下沉操作原理、时间复杂度分析,以及与标准库priority_queue的对比。特别强调了C++模板类设计、const成员函数和异常处理等编程细节,并列举了优先队列在图算法、任务调度等场景的应用。通过实现最小堆优先队列,帮助读者深入理解这一高效数据结构的底层原理。

2025-09-09 10:24:32 604

原创 Boost::Asio 异步读写 API 详解与Demo

本文介绍了Boost::Asio库中的异步读写API使用方法和实现细节。主要内容包括:1)核心概念:IO上下文和生命周期管理;2)异步读写API分类与适用场景对比;3)数据节点类(mynode)实现,用于缓存读写数据;4)会话类(mysession)设计,封装套接字操作。重点强调了线程安全、数据生命周期管理以及两种不同异步读写方式(部分读写与全量读写)的区别和使用场景。通过共享指针和互斥锁确保异步操作的安全性,提供了完整的类实现代码框架。

2025-08-26 13:33:34 843

原创 悬垂指针概述

在编程中,悬垂指针(Dangling Pointer) 是指指向已被释放(或回收)的内存地址的指针。此时指针本身仍保留着原来的内存地址值,但该地址对应的内存已经无效(可能被系统回收、分配给其他变量,或标记为不可用)。最常见于手动管理内存的语言(如 C/C++),典型场景包括:释放内存后未重置指针当通过 (C++)或 (C)释放动态分配的内存后,若未将指针置空,指针会继续指向已释放的内存地址,成为悬垂指针。返回局部变量的地址函数内的局部变量在函数执行结束后会被自动销毁(内存释放),若返回其地址,接收

2025-08-24 16:32:22 316

原创 Boost.Asio 同步读写 API 详解 与 同步服务器客户端demo实现

Boost.Asio同步网络通信解析 本文详细介绍了Boost.Asio库中同步网络通信的实现方法,主要内容包括: 同步与异步通信的对比 同步通信:阻塞等待I/O完成,逻辑简单但资源利用率低 异步通信:非阻塞回调,适合高并发场景 同步I/O核心API分析 写操作:write_some()、write()和send()的区别与使用场景 读操作:read_some()、read()和receive()的功能特点 完整实现案例 回声服务器:多线程处理客户端连接 会话管理:使用线程集合和互斥锁保证线程安全 文章通过

2025-08-21 21:48:58 1036

原创 Boost.Asio中buffer的使用详解

Boost.Asio中的buffer机制详解:buffer是网络数据传输的临时缓存区,Boost.Asio提供mutable_buffer(可写)和const_buffer(只读)两种核心类型,它们封装内存指针和长度。API通过BufferSequence概念支持分散/聚集I/O操作,允许一次操作多个缓冲区。asio::buffer()函数可自动将常见数据类型转换为符合BufferSequence的缓冲区对象。使用时需注意生命周期管理和类型安全,避免悬垂引用。这种设计实现了高效灵活的内存管理,是Boost.

2025-08-19 22:00:36 969 1

原创 二分算法(二分答案)

本文详细介绍了二分答案算法的两种典型应用场景:求满足条件的最小值和最大值。通过核心原理分析和示例代码,展示了如何利用二分法高效求解具有单调性的最优解问题。关键点包括:单调性判断、check函数设计、边界初始化和循环终止条件控制。文章还结合力扣例题(如1283和2226题)进行解析,帮助读者理解二分答案的实际应用。该算法能将时间复杂度优化至O(log n),适用于求解最值类问题。

2025-08-19 20:32:06 629

原创 Boost.Asio 实现 TCP 服务器 - 客户端连接(同步)

本文介绍了如何使用Boost.Asio库实现TCP服务器-客户端连接。服务器端通过io_context、tcp::endpoint和tcp::acceptor监听端口并接受连接,客户端使用tcp::socket发起连接请求。关键组件包括:io_context(管理I/O操作)、endpoint(定位网络位置)、acceptor(服务器监听)和socket(实际通信)。测试代码展示了如何通过线程模拟服务器和客户端交互,连接成功后进行通信。该实现是网络编程的基础,可进一步扩展为复杂应用。

2025-08-18 22:01:34 725

原创 网络编程基础

的协议,通信前需建立连接(类似“打电话”:拨号→接通→聊天→挂电话)。服务端负责“守株待兔”,客户端负责“主动拨号”,双方通过**套接字(socket)**实现通信。

2025-08-17 21:31:15 406

原创 滑动窗口算法框架(不定长窗口)

判断窗口合法性,收缩时更新最小长度。(子数组、子串),要求时间复杂度为。在数组或字符串中寻找满足特定条件的。维护窗口内最多字符的频次,通过。用哈希表记录字符频次,通过。

2025-06-14 17:41:46 415

原创 数据结构与算法学习记录

首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标对应的数据。数组下标都是从零开始的数组内存空间的地址是连续的删除数组的元素实际上是覆盖该元素正因为数组在内存中是连续存储的,可以通过下标索引访问数组元素O(1),但相应的删除和插入元素时需要移动其他元素O(n)。那么二维数组在内存中的空间地址是连续的吗?

2025-04-07 19:36:57 1648

原创 400.第N位数字(中等)

第N位数字给你一个整数 n ,请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …] 中找出并返回第 n 位上的数字。示例 1:输入:n = 3输出:3示例 2:输入:n = 11输出:0解释:第 11 位数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, … 里是 0 ,它是 10 的一部分。第一次思路:将整数序列转换为字符串,然后按索引,找出对应位置的数字。代码class Solution {

2021-11-30 21:24:28 595

原创 1700.无法吃到午餐的学生数量(简单)

无法吃到午餐的学生数量学校的自助午餐提供圆形和方形的三明治,分别用数字 0 和 1 表示。所有学生站在一个队列里,每个学生要么喜欢圆形的要么喜欢方形的。餐厅里三明治的数量与学生的数量相同。所有三明治都放在一个栈 里,每一轮:如果队列最前面的学生 喜欢 栈顶的三明治,那么会 拿走它 并离开队列。否则,这名学生会 放弃这个三明治 并回到队列的尾部。这个过程会一直持续到队列里所有学生都不喜欢栈顶的三明治为止。给你两个整数数组 students 和 sandwiches ,其中 sandwiches[

2021-11-12 17:35:29 832

原创 19.删除链表的倒数第N个节点(中等)

删除链表的倒数第N个节点给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]示例 2:输入:head = [1], n = 1输出:[]示例 3:输入:head = [1,2], n = 1输出:[1]代码/** 1. Definition for singly-linked list. 2. public class L

2021-10-31 22:08:23 114

原创 387. 字符串中的第一个唯一字符(简单)

字符串中的第一个唯一字符给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = “leetcode”返回 0s = “loveleetcode”返回 2代码class Solution { public int firstUniqChar(String s) { char[] arr = s.toCharArray(); int j; int[] numArray = new int[

2021-10-31 14:36:09 212

原创 21.合并两个有序链表(简单)

合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]代码(官方题解)/** * Definition for singly-linked list. * public class Lis

2021-10-29 14:03:47 172

空空如也

空空如也

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

TA关注的人

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