C/C++技术干货
文章平均质量分 95
关于C和C++编程的宝贵知识和实用技巧。深入探讨C和C++编程语言的各个方面,包括语法、数据结构、算法、性能优化、内存管理、多线程编程等等。通过清晰的解释、实用的示例和深入的讨论,帮助更好地理解和应用C/C++编程技术。《C/C++技术干货》专栏将不定时更新,分享最新、最实用的C/C++技术知识。
Lion 莱恩呀
专注于后端全栈开发技术研究与分享。覆盖领域包括但不限于:C/C++底层原理与实践、Linux系统编程与运维、数据库(SQL/NoSQL)设计与优化、分布式系统架构与实现、主流中间件应用与源码、云原生(容器、K8s等)技术栈。致力于分享实战经验、系统设计思路与前沿技术洞察。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ function 和函数指针的深度对比
本文对比了C++中函数指针和std::function的特性与适用场景。函数指针是C语言遗留机制,直接存储函数地址,具有零开销、高性能和跨语言兼容性等优势,但无法处理有状态的可调用对象。C++11引入的std::function通过类型擦除技术,能够统一包装函数指针、Lambda表达式和函数对象等各类可调用实体,提供类型安全的通用接口,但会带来轻微运行时开销。两者分别适用于需要极致性能的底层场景和强调灵活性的高阶编程场景。开发者应根据具体需求在性能与通用性之间权衡选择。原创 2026-06-01 09:00:00 · 262 阅读 · 0 评论 -
函数式编程该怎么学?一份系统性的 FP 学习路线图
函数式编程核心概念与实践指南 函数式编程(FP)是一种基于数学函数概念的编程范式,强调无副作用和不可变性两大原则。FP要求函数像数学公式一样纯净——给定相同输入永远返回相同输出,这种特性使代码更易测试和维护。 FP的核心概念包括:纯函数(无副作用、输入决定输出)、高阶函数(以函数为参数或返回值)、函数组合(串联多个函数)、柯里化(分解多参数函数)和不可变数据结构。实践FP的关键在于思维模式转变,从命令式的"如何做"转向声明式的"做什么"。原创 2026-05-21 09:00:00 · 369 阅读 · 0 评论 -
为什么分布式KV的全是LSM树+Raft,可以用B+树加Raft吗?
分布式KV存储的主流架构采用LSM树+Raft组合,主要解决单机存储性能和多机数据一致性问题。LSM树通过顺序写入和日志结构设计实现高写入吞吐量,与Raft的WAL机制天然契合。相比之下,B+树+Raft存在写入性能差、双重持久化开销等问题,因此未被广泛采用。当前主流系统如TiKV、HBase等都基于LSM树架构,而OceanBase则采用LSM与B+树混合方案。该架构特别适合高并发写入场景,通过内存缓冲和分层存储实现高效数据管理。原创 2026-05-18 09:00:00 · 391 阅读 · 0 评论 -
C++ 函数模板为什么不支持偏特化?
C++函数模板不支持偏特化的根本原因在于避免与重载决议机制产生冲突。类模板支持全特化和偏特化,因为其实例化仅基于类型模式匹配。而函数模板的调用涉及更复杂的重载决议过程,需要考虑参数转换、模板推导等因素。若允许函数模板偏特化,编译器将面临特化匹配与重载决议的优先级冲突,导致难以解决的歧义问题。因此,C++标准选择仅支持函数模板全特化,通过函数重载来实现类似偏特化的功能,从而保持语言设计的简洁性和可预测性。原创 2026-04-13 09:00:00 · 385 阅读 · 0 评论 -
C++ 接口与实现分离的:Pimpl 惯用法是工程优化还是过度设计?
Pimpl惯用法通过将类的实现细节隐藏在私有指针后,有效降低了编译依赖、提高了封装性并保障了二进制兼容性,但代价是增加了代码复杂性和轻微运行时开销。该模式通过分离接口与实现,减少了头文件修改引发的级联重编译,尤其适用于大型C++项目。虽然需要额外维护实现类并引入间接调用,但其带来的编译效率和ABI稳定性优势在复杂系统中往往超过这些成本。原创 2026-04-10 09:00:00 · 760 阅读 · 0 评论 -
C++ 模板的优雅应用:深入解析奇异递归模板模式 (CRTP)
文章摘要: C++的奇异递归模板模式(CRTP)是一种通过基类模板将派生类作为模板参数的静态多态技术。其核心思想是基类在编译时获取派生类类型信息,通过static_cast调用派生类方法,避免虚函数开销。典型应用包括: 通用比较操作符:基类Comparable<Derived>自动生成!=、>等操作符,派生类仅需实现核心逻辑(如equalsImpl); 编译时多态:替代动态多态,提升性能; 代码复用与类型安全:强制派生类实现特定接口,否则触发编译错误。原创 2026-04-07 09:00:00 · 377 阅读 · 0 评论 -
分布式系统远程调用:HTTP+RESTful 和 RPC 深度解剖
分布式系统远程调用技术深度解析:HTTP+RESTful与RPC对比 本文深入剖析了分布式系统中两种主流远程调用技术:HTTP+RESTful和RPC。RPC(远程过程调用)通过客户端存根和服务器存根的协作,实现透明化的远程服务调用,其核心特点包括面向过程/行为、紧耦合接口、支持多种高效序列化协议,以及同步调用机制。典型代表如gRPC框架,基于HTTP/2和Protocol Buffers,提供高性能服务通信。相比之下,HTTP+RESTful采用无状态的资源操作方式,更适合开放API场景。文章从原理、工作原创 2026-03-17 09:00:00 · 445 阅读 · 0 评论 -
构建 C++ HashMap:从原理到实践的深度解析
工业级HashMap是一种高性能、稳定可靠的键值存储结构,其核心在于哈希函数设计、冲突处理策略和内存管理优化。主要特点包括:1)采用链式法或开放寻址法解决冲突,链式法通过链表或红黑树存储冲突元素,开放寻址法通过探测序列寻找空闲位置;2)支持模板化键值类型,可自定义哈希函数和比较器;3)关注内存效率和并发安全。实现工业级HashMap需要平衡时间复杂度、内存开销和线程安全等多方面因素,在哈希函数均匀性、负载因子控制和扩容策略等方面进行深度优化。原创 2026-03-09 09:00:00 · 783 阅读 · 0 评论 -
C++ 模板编程与模板元编程:深度解析与实践指南
本文介绍了C++模板编程的核心概念与应用。主要内容包括: 函数模板:通过泛型编程实现通用函数,避免为不同数据类型编写重复代码。示例展示了swap函数的模板实现、函数重载和显式特化。 类模板:构建通用容器的基础,示例演示了Stack类的模板实现。详细说明了类模板的定义语法、成员函数实现方式以及非类型模板参数的应用。 模板编程是C++实现泛型编程的核心机制,通过抽象数据类型共性,显著减少代码量并提高可靠性。文章提供了从基础语法到高级特性的结构化学习路径,帮助开发者掌握这一强大工具。原创 2026-03-02 09:00:00 · 656 阅读 · 0 评论 -
C++20 format 如何超越 sprintf,开启现代格式化新篇章
这篇文章就深入探讨 std::format 相较于 sprintf 的核心优势,分析在类型安全、性能和可扩展性方面的提升。解析 std::format 强大而富有表现力的格式说明符语法,理解标准委员会为何选择这种全新的方式,而不是简单沿用 printf 风格。原创 2026-02-26 09:00:00 · 1251 阅读 · 0 评论 -
C++ STL:从入门到精通,哪些是你的必备技能?
C++ STL(标准模板库)是C++标准库的核心组成部分,采用泛型编程思想,提供高效的数据结构和算法。STL包含六大核心组件:容器(如vector、map等数据结构)、算法(通用操作函数)、迭代器(连接容器与算法的接口)、函数对象(可调用对象)、适配器(接口转换)和分配器(内存管理)。其优势在于避免重复开发、性能优化和代码标准化。STL通过模板实现通用性,利用迭代器解耦容器与算法,是现代C++开发的必备技能,广泛应用于日常编程和面试考察。掌握STL能显著提升开发效率和代码质量。原创 2026-02-11 09:00:00 · 669 阅读 · 0 评论 -
C++ STL为何“缺席”线程池?探究标准库设计哲学与并发演进
本文探讨了C++标准库未内置线程池的深层原因。首先,C++的设计哲学强调底层控制和零开销抽象,倾向于提供基础并发原语而非高层封装。其次,线程池实现具有复杂性和多样性,涉及线程管理、任务调度、异常处理等多方面设计选择,难以形成通用方案。此外,标准化过程中面临共识难题,委员会对引入复杂组件持谨慎态度。文章还指出,C++11的std::async尝试提供类似功能,但暴露出线程复用导致的thread_local变量生命周期问题。这些因素共同导致线程池更适合作为第三方库而非标准库组件。原创 2026-02-03 09:00:00 · 1231 阅读 · 0 评论 -
解密 cpp-httplib:为何在“阻塞I/O + 线程池”模式下仍使用 select、poll?
摘要: cpp-httplib 是一个轻量级 C++ HTTP/HTTPS 库,采用"阻塞IO+线程池"模型,为每个连接分配独立线程。有趣的是,它仍使用 select()/poll() 机制,主要作用并非实现单线程高并发,而是:1) 为阻塞IO操作提供超时控制,避免线程无限阻塞;2) 检测连接异常状态;3) 支持HTTP Keep-Alive机制的空闲超时管理。这种设计不同于典型的I/O复用模式,而是作为阻塞IO模型的辅助工具,在保持编程简单性的同时增强了健壮性。原创 2026-01-16 09:00:00 · 1594 阅读 · 0 评论 -
指针的奥秘:为什么地址“0x数字”还需要“类型”的指引?
指针的本质是内存地址,但仅知道地址是不够的。指针类型为编译器提供关键上下文信息:决定操作的内存范围(如int读取4字节)、二进制数据的解释方式(整数/浮点数等)以及指针算术的步长(p++的增量)。void无类型指针的特殊性反向印证了类型的重要性——它无法直接解引用或运算,必须转换为具体类型才能操作。类型赋予指针意义,使其能正确访问和操作内存数据。原创 2026-01-14 09:00:00 · 965 阅读 · 0 评论 -
怎么用vscode编写和调试cpp代码? 一站式教程(含 tasks.json & launch.json 详解)
本文介绍了在Windows系统下使用VS Code进行C++开发的完整配置流程。作者推荐采用WSL(Windows Subsystem for Linux)作为开发环境,而非传统的MinGW-w64方案。文章详细讲解了tasks.json和launch.json的配置方法,重点解决了多文件编译和调试问题。同时推荐使用CMake管理复杂项目,并提供了通用配置模板。通过合理配置,VS Code可以提供优秀的C++开发体验,包括一键编译、断点调试等功能。文中还给出了插件推荐和具体操作截图,为开发者提供了实用参考。原创 2025-12-29 09:00:00 · 2597 阅读 · 0 评论 -
在 Windows 上快速搭建 VSCode 的 C++ 开发环境(基于 WSL)
本文介绍了如何在Windows系统上通过VSCode和WSL搭建高效的Linux C++开发环境。WSL 2提供了接近原生Linux的性能和兼容性,而VSCode通过Remote-WSL扩展实现无缝连接。文章详细说明了WSL 2的安装步骤,包括系统要求检查、功能启用、Ubuntu发行版安装及初始配置。这套方案解决了Windows下Linux工具链配置复杂的问题,为开发者提供了兼具Windows便捷性和Linux原生开发体验的工作环境。原创 2025-12-26 09:00:00 · 2427 阅读 · 0 评论 -
还在纠结C++ IDE?最值得推荐的 6 款 C++ IDE都在这里!
C++ IDE推荐指南:6款高效开发工具详解 本文精选6款主流C++集成开发环境,为不同需求的开发者提供专业推荐。微软Visual Studio是Windows平台首选,提供全面的调试和性能分析工具;轻量级VS Code通过扩展可打造个性化开发环境;Qt Creator专为跨平台GUI开发优化;商业级CLion提供卓越的代码分析能力;Eclipse CDT适合嵌入式开发;Dev-C++则以简单易用著称。每款IDE均附详细特点分析及安装教程,涵盖从免费开源到专业付费的各种类型,帮助开发者根据项目需求和个人偏好原创 2025-12-16 09:00:00 · 2403 阅读 · 0 评论 -
C++项目中的Boost.Test单元测试实践:从入门到精通
本文介绍了使用Boost.Test框架进行C++单元测试的实践方法。通过一个简单的求和函数示例,展示了测试用例的编写、断言的使用以及测试模块的配置。文章详细讲解了BOOST_REQUIRE和BOOST_CHECK等断言的区别,并提供了完整的CMake构建配置,包括如何集成Boost.Test单元测试框架。示例代码包含求和函数实现、测试用例和CMake配置文件,为开发者提供了一个完整的单元测试实践模板。原创 2025-12-11 09:00:00 · 971 阅读 · 1 评论 -
C++20 异步编程:用future、promise 还是协程?
C++20引入协程为异步编程带来革新,相比C++11的future/promise机制具有明显优势。future/promise虽简化了异步任务管理,但存在组合性差、阻塞调用、回调地狱等问题。协程通过"暂停-恢复"机制实现更直观的异步代码编写,降低内存开销和上下文切换成本。C++20提供co_await、co_yield等关键字支持协程,配合第三方库可构建高效异步应用。协程代表现代C++异步编程的未来方向,特别适合复杂异步流程场景。原创 2025-12-03 09:00:00 · 983 阅读 · 0 评论 -
深度剖析 C++vector 扩容机制:为什么总要“大动干戈”?
摘要: std::vector 扩容时无法直接扩展现有内存块,必须重新分配并拷贝元素,主要基于三个原因:1) 内存连续性要求迫使必须获取更大的连续空间;2) 操作系统无法保证原内存块尾部有足够空闲空间;3) C++ 对象生命周期管理需要正确调用构造/析构函数,简单内存拷贝会导致资源管理混乱。虽然看似低效,这种"先分配-后拷贝-再释放"的机制确保了类型安全性和可靠性,是平衡性能与正确性的最优解。原创 2025-12-01 09:00:00 · 849 阅读 · 0 评论 -
深入理解 C++ Lambda 表达式的引用捕获:原理、用法与潜在陷阱
本文深入分析了C++ Lambda表达式中[&]引用捕获的原理与特性。[&]并非捕获所有变量,而是按引用捕获Lambda体中实际使用的外部变量,编译器会为Lambda生成包含对应引用成员变量的匿名类。通过工具展示编译器展开代码,直观呈现捕获机制。对比[=]值捕获方式,[&]直接操作原始变量,避免复制开销,但需注意潜在陷阱。文章揭示了Lambda捕获的本质,帮助开发者深入理解这一重要特性。原创 2025-11-26 09:00:00 · 1186 阅读 · 0 评论 -
C++ 模板元编程:原理、实践、优势与局限性全解析
C++模板元编程简介 C++模板元编程(TMP)是一种利用模板在编译时执行计算的编程技术。它基于模板实例化、特化和SFINAE机制,将计算从运行时转移到编译期,实现零开销抽象。主要特点包括: 编译时计算:通过递归模板实例化实现阶乘等计算,结果直接硬编码到可执行文件中。 类型操作:利用类型特征(type traits)检查类型属性,如std::is_integral<T>判断是否为整数类型。 控制流:通过模板全特化/偏特化模拟if-else分支,递归实例化模拟循环。原创 2025-11-20 09:00:00 · 1164 阅读 · 0 评论 -
C++11 thread 参数传递深度解析:为什么需要 std::ref 而非直接引用?
摘要:C++11的std::thread在参数传递时默认采用值拷贝方式,即使线程函数声明为引用参数。这种设计避免了多线程中的悬空引用问题,但也导致无法通过引用修改原始变量或传递不可拷贝对象。std::ref/cref提供解决方案,它们包装引用使其按引用传递,同时在语法上明确标识出潜在的共享数据。本文通过代码示例展示了直接传递引用的陷阱,并解释std::ref如何保留引用语义,同时提醒开发者注意线程安全。原创 2025-11-17 09:00:00 · 1881 阅读 · 0 评论 -
C++11 值类别演进:从二分法到五分法,揭秘移动语义的基石
C++11 的值类别系统和移动语义的引入,是 C++ 发展史上的一个里程碑。它不仅仅是语法上的增添,更是对 C++ 核心哲学——“零开销抽象”和“尽可能接近硬件”——的深刻践行。它使得 C++ 程序员能够编写出既高效又安全的现代代码,更好地应对大规模数据处理、并发编程以及系统级开发中的挑战。原创 2025-11-14 09:00:00 · 985 阅读 · 0 评论 -
C++23深度解析:一次“小修小补”还是“大有可为”?
C++23作为C++20之后的迭代版本,被部分开发者视为C++20的补充性更新。其核心定位是对C++20重大特性(如协程、概念、模块等)进行完善而非颠覆性创新。然而,C++23通过多项实用增强展现了重要价值。原创 2025-11-10 09:00:00 · 1261 阅读 · 0 评论 -
C++泛型编程与模板:为何它对现代C++开发者如此重要?
C++模板作为泛型编程的核心,提供了强大的代码复用、类型安全和性能优化能力。它在标准库、高性能计算等领域广泛应用,使开发者能够编写高效、通用的代码。虽然初学者和业务应用开发者只需掌握模板的基本用法(如STL容器和算法),但在库开发、高性能优化等场景中,深入理解模板的高级特性(如模板元编程、静态多态)成为关键。随着C++标准的演进,模板功能不断强化,对模板的掌握程度应结合具体开发需求,而非一味追求精通所有高级特性。原创 2025-11-09 14:21:09 · 988 阅读 · 0 评论 -
一文看懂1MB的存储容量究竟有多大?它能装下什么?
1MB存储容量详解:1MB等于1,048,576字节,可存储约52万个汉字(相当于一本《西游记》),或350页A4纯文本。在计算机中,1MB可容纳约100万个布尔值或字符,26万个整数。虽然1MB能存储大量基础数据,但在现代存储技术中已显得微不足道。了解1MB的实际大小有助于管理存储设备、优化文件传输和规划网络流量使用。随着存储技术发展,MB级容量已难以满足高清图片、视频等现代文件需求。原创 2025-10-27 09:00:00 · 2974 阅读 · 0 评论 -
C++ 编程实战:手把手教你实现一个计算器程序
这篇文章手把手教你用C++实现一个命令行计算器程序,涵盖核心概念和实用技巧。主要内容包括: 实现功能:支持加减乘除、运算符优先级、括号嵌套、浮点数运算和基础错误处理 核心概念:词法分析(分词)和语法分析(构建AST) 解析方法:采用递归下降解析器,通过expression()、term()、factor()函数层级处理运算符优先级 技术要点:字符串处理、函数模块化、异常处理、递归调用 学习收获:理解编译器基本原理,提升逻辑思维和模块化设计能力 文章适合C++初学者,通过实践项目串联零散知识点,为更复杂的语言原创 2025-10-24 09:00:00 · 1714 阅读 · 0 评论 -
彻底搞懂异步和多线程:概念、原理与应用场景对比
异步编程与多线程编程对比分析 异步编程和多线程编程都是为了提升程序性能,但实现方式和适用场景不同。异步编程基于非阻塞I/O和事件驱动,通过单线程事件循环高效处理高并发I/O任务(如网络服务器),能显著提升吞吐量但调试复杂。多线程编程则利用多核CPU实现真正并行,适合CPU密集型计算任务,但需处理线程同步和资源竞争问题。C++提供了丰富支持:标准库的std::async、future/promise模型和C++20协程简化异步开发,而std::thread及同步原语支持多线程编程。选择时应根据任务类型(I/O原创 2025-10-22 09:00:00 · 1620 阅读 · 0 评论 -
推荐几个适合新手学习的 C++ 开源项目,让你不再纸上谈兵!
摘要: 本文为C++新手推荐了6个适合入门的开源项目,包括线程池、数独游戏、俄罗斯方块等小型项目,以及STL实现和算法集合。这些项目代码精简、功能明确,涉及C++11特性、并发编程、数据结构等核心知识点。文章建议从阅读代码、调试运行开始,逐步尝试修改和贡献,并强调实践与记录的重要性。通过参与真实项目开发,新手可将理论知识与实际应用结合,快速提升C++编程能力。原创 2025-10-15 09:00:00 · 2142 阅读 · 0 评论 -
C++ 虚函数之谜:为什么模板成员函数和静态函数不能是虚函数?
摘要: C++虚函数通过虚指针(vptr)和虚表(vtable)实现运行时多态,允许基类指针调用派生类函数。但模板成员函数和静态函数不能声明为虚函数,原因如下: 模板成员函数:在编译时按需实例化,可能生成无限版本,而虚表需在编译时确定固定大小和函数地址。两者机制冲突,无法兼容。 静态函数:属于类而非对象,无this指针,无法通过虚指针(vptr)动态分派。虚函数依赖对象实例的运行时绑定,与静态函数的类级调用本质矛盾。 这一限制体现了C++多态与泛型编程的边界,深入理解有助于掌握语言设计哲学。原创 2025-10-13 09:00:00 · 1185 阅读 · 0 评论 -
C++临时对象:为什么它看起来像 const,却又不是?
掌握临时对象的生命周期、引用绑定规则以及生命周期延长机制,是成为一名优秀C++开发者的基石。它使我们能够更深入地理解C++的底层工作原理,编写出更健壮、更高效、更符合现代C++范式的代码。原创 2025-10-09 09:00:00 · 4713 阅读 · 1 评论 -
还在纠结C++ mutable?一文带你理解 const 背后的“变”与“不变”
摘要: C++中的const关键字确保代码健壮性和安全性,但存在物理常量性与逻辑常量性的区别。mutable关键字允许在const函数中修改特定成员变量,以支持逻辑常量性,如缓存优化和线程同步。通过mutable,可以在保持对象对外行为不变的前提下优化内部实现,避免破坏const语义。典型应用场景包括懒加载缓存(提升性能)和互斥锁管理(确保线程安全),从而在不牺牲const正确性的情况下实现更灵活的代码设计。原创 2025-09-29 09:00:00 · 1112 阅读 · 0 评论 -
C++20 Ranges View 的魔力:非 owning 的 Range 操作
C++20 Ranges库引入的view概念提供了一种轻量级、非拥有的数据视图机制。view不持有数据所有权,仅通过迭代器引用底层数据,避免了不必要的数据拷贝,显著提升性能。其惰性求值特性使得操作链(如过滤、转换)仅在迭代时执行,构建高效的数据处理管道。与传统容器相比,view不管理内存且拷贝开销极小,但需注意底层数据的生命周期。这种设计实现了零拷贝操作,为C++数据处理提供了更现代、高效的解决方案。原创 2025-09-22 09:00:00 · 1101 阅读 · 0 评论 -
C++20 Range 概念详解:深入理解 Range 的类型
C++20 Ranges 库深入解析:从基础概念到高级应用 摘要:本文系统介绍了C++20引入的Ranges库,重点解析了四种核心Range类型:input_range(单次遍历)、forward_range(多次前向遍历)、bidirectional_range(双向遍历)和random_access_range(随机访问)。文章通过代码示例展示了每种Range的特性和应用场景,比较了它们的能力差异,并阐述了理解不同Range类型的重要性。Ranges库通过将序列抽象为单一实体,支持惰性求值和视图组合,显原创 2025-09-17 08:00:00 · 1550 阅读 · 0 评论 -
自定义 C++20 Range 适配器:扩展你的工具箱
本文介绍了C++20引入的Ranges特性,重点讲解了如何自定义Range适配器来扩展数据处理能力。Ranges提供了对数据集合的统一访问方式,核心组件包括Range、View和Range适配器。自定义适配器遵循惰性求值、不拥有数据和可组合性等原则,通过定义View类型和实现适配器对象来完成。在C++23中,还可以使用range_adaptor_closure来组合多个适配器。自定义适配器能够针对特定业务需求封装数据处理逻辑,提高代码的可读性和复用性。原创 2025-09-10 09:00:00 · 1072 阅读 · 0 评论 -
C++20 Ranges管道操作:流畅地组合 Range 适配器
本文介绍了C++20 Ranges库中的管道操作符|,它能够流畅地组合多个Range适配器,实现复杂的数据处理逻辑。通过管道操作符,开发者可以构建从左到右的数据处理流水线,显著提升代码可读性和表达力。文章阐述了管道操作符的基本语法、链式调用能力及其工作原理,并通过具体示例展示了如何将过滤、转换等操作串联起来。这种操作符重载机制使得数据处理流程更加直观,避免了传统嵌套写法带来的理解困难。原创 2025-09-05 09:00:00 · 994 阅读 · 0 评论 -
深入理解并查集(Disjoint Set Union)算法
并查集是一种高效处理不相交集合的树形数据结构,支持查找(Find)和合并(Union)两大核心操作。通过路径压缩和按秩/大小合并优化,可将时间复杂度从O(n)降低至接近O(1)的均摊复杂度。其典型应用包括判断图连通性、检测环、计算连通分量等。初始时每个元素自成一个集合,通过优化策略使树结构保持平衡和扁平,极大提升操作效率。并查集在图论、网络分析和算法竞赛中具有重要价值,是解决动态连通性问题的理想选择。原创 2025-08-27 09:00:00 · 1970 阅读 · 0 评论 -
写一个能抗粘包拆包的 TCP 服务器?看这篇 C++ 源码解析!
TCP粘包拆包是网络编程常见问题。本文深入浅出地解释其原理,并提供清晰的代码示例,帮助开发者轻松解决这一难题,提升网络通信效率。原创 2025-08-18 09:00:00 · 771 阅读 · 0 评论 -
C++20 Range 适配器入门:三板斧 transform, filter, take
本文介绍了C++20引入的Range适配器,重点讲解了transform、filter和take三个核心适配器的使用方法和应用场景。Range适配器通过惰性求值和链式操作,提供了一种声明式数据处理方式,相比传统STL算法具有更高的可读性和灵活性。 transform适配器用于数据转换,filter适配器用于条件筛选,take适配器用于截取前N个元素。这些适配器可以组合使用,形成清晰的数据处理流程。原创 2025-08-06 09:00:00 · 1904 阅读 · 0 评论
分享