- 博客(42)
- 收藏
- 关注
原创 C++11- 究竟什么是右值
本文介绍了C++中左右值概念及其应用。左值(lvalue)是具有身份(可获取地址)且不可移动的表达式,如变量名;纯右值(prvalue)是临时对象,如字面量;将亡值(xvalue)是可移动的左值。右值引用(T&&)主要应用于:1)实现移动语义,避免深拷贝;2)实现完美转发,保持参数原始值类别;3)优化标准库容器性能。通过std::move和std::forward,可高效转移资源所有权或完美转发参数。这些特性共同构成了C++高效的资源管理系统。
2025-09-05 00:49:36
322
原创 滑动窗口的典例以及思路阐述
本文介绍了滑动窗口算法在解决字符串问题中的应用,重点分析了两道LeetCode题目(无重复字符的最长子串和字母异位词)。文章指出滑动窗口的核心在于:1)使用哈希表记录字符计数;2)通过窗口滑动动态调整边界;3)根据条件判断何时扩展或收缩窗口。特别针对字母异位词问题,详细说明了固定窗口的处理逻辑,包括初始化计数、右指针扩展时更新状态、左指针收缩条件等。最后总结了解决滑动窗口问题的思考框架:明确窗口特性、定义状态变量、确定边界调整条件以及处理边界情况。文章提供了完整的代码示例和解题思路分析。
2025-10-21 17:18:03
411
原创 排序--基数排序
摘要:基数排序是一种非比较型排序算法,分为LSD(最低位优先)和MSD(最高位优先)两种实现方式。LSD从最低位开始逐位排序,时间复杂度O(d*(n+k)),适合整数排序;MSD从最高位开始递归排序,适合字符串字典序排序。LSD实现简单、内存访问连续,MSD能提前终止但实现复杂。文章提供了LSD(整数)和MSD(字符串)的C++代码实现,展示了其具体应用场景和性能特点。
2025-09-15 09:58:41
816
原创 C++中的类型转换
C++提供了四种类型转换运算符,比C语言的强制类型转换更安全明确:1. static_cast用于相关类型转换(如数值类型转换、类层次向上转换),编译期完成;2. dynamic_cast用于多态类型的安全向下转换,运行时检查类型有效性;3. const_cast专门用于添加/移除const或volatile限定符,需谨慎使用;4. reinterpret_cast进行底层位模式重解释,最危险但特定场景需要。这些运算符各司其职,提高了代码的安全性和可读性。
2025-09-12 17:24:05
841
原创 设备服务管理上报方案
本文介绍了一个设备管理上报系统的实现方案。通过WebSocket连接,服务实例能够主动向设备管理服务注册并周期性上报状态信息。核心功能包括:1)启动时发送注册消息(包含设备ID、最大负载等);2)定时发送心跳包,附带当前实际连接数;3)具备断线重连机制(采用指数退避算法)和优雅停止功能。系统集成在服务主进程中,通过后台协程方式运行,在配置文件中可灵活启用或关闭该功能。实现时还考虑了配置校验、默认值处理、异常日志记录等细节,确保系统稳定可靠。该方案可用于监控服务实例状态,为负载均衡和故障恢复提供数据支持。
2025-09-01 17:43:02
412
原创 一文理清TCP协议的通讯流程
本文详细解析了TCP通信全生命周期,包括三次握手建立连接、数据传输阶段和四次挥手释放连接的全过程。重点剖析了三次握手与四次挥手的必要性:三次握手确保双方通信能力正常,防止无效连接;四次挥手则基于TCP全双工特性,需要独立关闭双向通道。文章还介绍了异常处理机制,并提供了C语言实现的客户端/服务端通信代码示例,展示了连接建立、数据收发和连接关闭的具体实现。最后提出了多线程和IO多路复用两种方案来解决服务端多客户端并发处理的问题,完整呈现了TCP可靠通信的实现原理。
2025-08-31 18:25:52
1663
原创 同步/异步日志库
它提供了⼀种创建对象的最佳方式,在工厂模式中,我们创建对象时不会对上层暴露创建逻辑,而是通过使用⼀个共同结构来指向新创建的对象,以此实现创建-使用的分离。一般对于一个项目来说,都会设置一个默认的日志输出等级,只有当输出的日志等级大于默认限制等级才会进行输出。使用建议:两个完全不⼀样的功能不应该放⼀个类中,⼀个类中应该是⼀组相关性很高的函 数、数据的封装。实际上格式化的过程其实就是按照次序从Msg中取出需要的数据进行字符串的连接的过程。LevelFormatItem :表示要从LogMsg中取出日志等级。
2025-08-30 19:16:30
948
原创 Linux--基础IO
因为IO相关函数与系统调用接口对应,并且库函数封装系统调用,所以本质上,访问文件都是通过fd访问的。关闭了1后,原本指向标准输出的file结构体,现在将1分配给新打开的myfile,故而本来输出到显示器上的内容就输出到文件myfile了。2. 库函数自带缓冲区,是用户级缓冲区,不是内核级缓冲区,显然write没有缓冲区,其在fork之间就已经输出了数据,故而fork之后也没有再次输出。Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2。
2025-08-28 16:24:04
942
原创 Windows11 环境 编译 mediapipe (已经成功运行结果)
本文详细介绍了在Windows系统上编译Mediapipe C++版本的完整流程。首先需要安装MSYS2、Python 3.12.0和Visual Studio 2019开发环境,然后配置Bazel工具和OpenCV 4.8.0库。文章重点说明了环境变量设置、Mediapipe源码配置修改方法,以及如何通过Bazel命令编译HelloWorld和holistic_tracking_cpu示例程序。最后还提供了解决网络代理问题和编译错误的实用技巧。
2025-08-25 18:47:02
1086
1
原创 Linux--进程控制
本文深入解析了Linux系统中的进程控制机制,主要涵盖以下内容:1. 进程创建:详细介绍了fork()函数的工作原理、写时拷贝机制及其代码实现;2. 进程终止:分析了三种退出方式(_exit、exit、return)的区别及适用场景;3. 进程等待:阐述了wait/waitpid函数的使用方法,包括阻塞和非阻塞模式;4. 程序替换:解析了exec函数族的6个变体及其参数传递方式;5. Shell实现原理:通过简易代码示例展示了shell命令解析和执行的核心流程。
2025-08-25 17:14:21
735
原创 动态规划--编译距离
编辑距离问题要求计算将一个字符串转换为另一个字符串所需的最少操作次数(插入、删除或替换字符)。该问题采用动态规划解法,定义dp[i][j]表示word1前i个字符转换为word2前j个字符的最小操作数。状态转移分两种情况:字符相同时直接继承前状态,不同时取三种操作的最小值。初始化边界条件后,通过双重循环填表求解。该算法时间复杂度O(mn),空间复杂度O(mn),广泛应用于拼写检查、生物信息学等领域。
2025-08-24 15:12:51
753
原创 动态规划--最长公共子序列/回文子串
摘要:本文分析了LeetCode上两道经典字符串动态规划问题。最长公共子序列;通过构建二维DP表,以str1[0,i]和str2[0,j]区间为状态,当字符相同时dp[i][j]=dp[i-1][j-1]+1,否则取max(dp[i-1][j],dp[i][j-1])。最长回文子串则利用dp[i][j]表示s[i,j]是否为回文,当s[i]=s[j]时需分三种情况处理。两种解法都展现了区间DP的思想,通过合理定义状态和转移方程有效解决问题。
2025-08-23 17:52:23
864
原创 Linux--进程核心概念
本文总结了Linux进程的核心概念。首先介绍了冯·诺依曼体系结构作为理解进程的基础,指出操作系统通过"先描述,再组织"的方式管理进程。重点阐述了进程控制块(PCB/task_struct)、进程标识符(PID/PPID)、进程创建(fork)及写时拷贝机制。详细分析了进程状态(R/S/D/T/X/Z)及其转换,特别说明僵尸进程的危害和孤儿进程的处理。还涵盖了进程优先级、环境变量、进程地址空间(虚拟内存)等重要概念,解释了虚拟地址到物理地址的映射原理。最后简要介绍了Linux的O(1)调度
2025-08-22 17:49:45
1195
原创 C++设计模式--策略模式与观察者模式
你知道常见的设计模式有哪些吗,本文用实际应用中的例子来说明两种设计模式,即策略模式和观察者模式,它们的底层原理与多态和继承十分紧密,也可以借助本文来回顾一下它们。
2025-08-21 18:13:58
726
原创 C++核心之多态
本文介绍了C++中的多态特性。多态是指不同对象执行相同操作时产生不同行为,主要通过虚函数实现。构成多态需要满足两个条件:必须通过基类指针或引用调用虚函数,且派生类必须重写基类虚函数。文章详细讲解了虚函数重写的规则和例外情况(如协变和析构函数重写),并介绍了C++11的override和final关键字用于检查重写。此外还区分了重载、重写和隐藏的概念,并介绍了抽象类(包含纯虚函数的类)的特点及其实现方式。多态实现了接口继承,使得派生类可以根据需要重写基类虚函数,从而实现不同的功能。
2025-08-21 01:00:29
716
原创 String模拟实现的补充说明
本文展示了String类的模拟实现及测试代码。测试内容包括构造函数、拷贝构造、赋值运算符、push_back、operator+=、append、resize、关系运算符、find、insert和erase等基本功能。类设计包含构造函数/析构函数、迭代器、容量操作、元素访问、修改操作、关系运算符和查找功能等核心接口。关键成员变量包括char*_str指针、size_t_size和_capacity。实现上采用strcpy进行字符串拷贝,使用copy-and-swap实现赋值,基于strcmp实现比较运算。
2025-07-30 23:50:30
617
原创 C++-STL-String重点知识
本文介绍了C++中的string类及其与C风格字符串的区别。string类本质是basic_string模板类的别名,提供自动内存管理、动态扩容和边界检查等特性,而C风格字符串需要手动管理内存且长度计算效率低。文章详细对比了两者在内存管理、长度计算和安全性上的差异,并给出了相互转换的方法。同时介绍了string类的基本操作,包括构造、容量控制、修改和查找等功能,并提供了一个模拟实现的string类代码示例,展示了其内部实现原理。
2025-07-30 23:11:13
1133
原创 堆的常见应用2
堆在解决 Top K 问题(即从海量数据中找出最大或最小的 K 个元素)中非常高效,核心思想是通过维护一个固定大小的堆结构,避免对全部数据进行排序,从而显著降低时间和空间复杂度。
2025-03-27 20:56:02
616
原创 堆的相关要点以及模拟实现
堆(Heap)是一种特殊的完全二叉树结构,它满足以下性质:结构性:必须是完全二叉树有序性:任意节点的值都满足特定的大小关系大根堆:父节点值 ≥ 子节点值,小根堆:父节点值 ≤ 子节点值。
2025-03-23 20:47:23
903
原创 带头双向循环链表实现
带头双向循环链表通过牺牲少量内存,换取了极致的操作灵活性与效率,尤其适合需要频繁头尾操作或循环遍历的场景。其核心难点在于维护指针的正确性,需严格遵循“修改指针四步法”,并在编码时始终关注循环特性与边界条件。
2025-03-16 18:11:05
383
原创 顺序表与链表·续
本文承接上文,对链表的要点进行提炼。前文提到顺序表适合需要且数据量固定的场景,而链表适合需要且数据量动态变化的场景。链表的引入弥补了顺序表在动态性和操作效率上的不足,是线性表的重要实现方式之一。
2025-03-07 23:56:57
950
1
原创 【进程的理解】(1)
操作系统 内存管理 进程管理 文件管理 驱动管理。pid_t getppid(void) 获得当前进程的父进程,子进程每次的Pid可能不同。3)pid属于操作系统内核的属性,用户想要获取得通过系统调用,即getpid()4) ctrl+C 在用户层面终止进程,kill-9 pid可以直接结束进程。2)每一个进程都要有自己唯一的标识符,也就是进程pid。操作系统对进程的管理实质是对PCB的管理。一个进程,一定要有一个自己的PCB。2.进程创建的代码方式。
2024-10-28 23:38:03
214
原创 【C++】类和对象(3)(默认成员函数--拷贝构造&赋值重载)
拷贝构造函数是构造函数的重载,用于创建一个对象时,以另一个同类型对象作为参数,从而将参数对象的数据成员的值复制给新创建的对象。函数只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰)。
2024-10-09 13:00:49
870
原创 【C++】类和对象(2)(默认成员函数--构造与析构)
构造函数是特殊的成员函数,构造函数虽然名叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象。class Datapublic:Data() //无参构造函数_year=1;_month=1;Data(int year,int month) //有参构造函数_year=year;int _month;//通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明d1.Print()
2024-09-25 03:16:59
848
原创 程序的翻译和运行环境
翻译环境,在这个环境中源代码被转换为可执行的机器指令。执行环境,用于实际执行代码。例如 test.c 经过翻译环境-> test.exe 经过运行环境 -运行在翻译环境中 – 编译(编译器),链接(链接器)编译又分为三个阶段-- 预处理(预编译),编译, 汇编。
2024-09-15 16:40:16
323
原创 动态内存管理(简介)
有时候固定的数据分配方式不适合所需要的空间未知的情况,这时候动态开辟空间就显得尤为重要了。C语言中有一些函数用来动态开辟管理空间。
2024-09-14 23:29:49
367
原创 【C++】类和对象(1)(基本知识)
相较于struct,在C++中更喜欢用class来定义类:// 类体:由成员函数和成员变量组成类有两种定义方式声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::一般最好使用第二种定义方式。
2024-09-14 20:53:33
1634
原创 【C++】入门篇(2)
引用不是新定义一个变量,而是给已存在变量取了一个别名,不会额外开辟空间,它和它引用的变量共用同一块内存空间。类型 & 对象名=引用实体;引用的特性:相比于C语言,C++中引用的提出,带来了一些新的用法与便利。引用常作为参数或者返回值使用。那么相比于传值,传引用有什么特点呢?有了引用,能否替代指针呢?指针和引用各有特点,不能完全替代,它们适用不同场景。在语法概念上引用就是一个别名,和其引用实体共用同一块空间。底层实现上实际是有空间的,因为引用是按照指针方式来实现的。以inline修饰的函数叫做内联函数,
2024-09-13 16:02:49
523
原创 【C语言】结构体内存对齐
本文探讨了C语言中结构体和枚举的内存对齐与使用规范。在结构体部分,详细分析了内存对齐规则:成员按对齐数(编译器默认对齐数与成员大小的较小值)的整数倍地址存放,结构体总大小为最大对齐数的整数倍。通过多个示例演示了不同排列方式对内存占用的影响(如S1占12字节而S2仅8字节),指出内存对齐以空间换时间的本质。结构体传参建议传递地址而非整个结构体以避免性能损耗。 位段部分介绍了通过冒号指定成员比特位数的语法特性,但其存在跨平台兼容性问题。枚举类型相比#define具有类型检查优势,默认从0开始递增赋值
2024-09-08 20:53:18
1776
原创 【C++】入门篇(1)
本文简要介绍有关于C++的一些入门基础知识与语法,以及C++是如何对C语言设计不合理的地方进行优化的,同时也为后续类和对象的学习做铺垫
2024-09-08 17:54:44
524
原创 数组与指针题型解析(2)
前文,介绍了在学习指针时容易感到混淆的点,结合一维数组和字符数组,指针,辨别分析了它们的常见含义,本文接着结合一些相关笔试题来分析二维数组名与结构体指针的含义。假设p 的值为0x200000(16进制表达形式)。如下表表达式的值分别为多少?此结果基于vs2022 x64环境得出。
2024-09-02 23:55:59
419
原创 数组与指针题型解析(1)续
在数组与指针题型解析(1)中,字符数组的题目实例3中还有关于strlen的部分内容没有说完,这篇主要对前文补充说明以及对下一篇解析(2)的介绍。(前文链接https://blog.youkuaiyun.com/2301_78696090/article/details/141393212)
2024-09-02 16:43:44
363
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅