自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++ std::move()详解:从小白到高手

摘要:本文深入解析C++11中的std::move()机制,揭示其作为类型转换而非移动操作的本质。文章从移动语义的必要性出发,通过代码示例展示std::move()在函数返回值优化、容器操作和避免拷贝中的实际应用场景。详细讲解了移动构造函数和移动赋值运算符的实现方法,并指出常见使用陷阱,如过度使用、移动后对象状态等问题。最后总结了最佳实践,强调理解std::move()作为所有权转移工具的核心作用,而非盲目使用。全文通过性能对比和典型示例,帮助开发者从原理到实践全面掌握移动语义。

2025-12-15 10:35:39 448

原创 C++静态变量详解(一学就会)

本文详细解析C++静态变量的关键特性和应用场景。静态变量存储在静态区,生命周期贯穿整个程序运行期,未初始化时自动置零。文章涵盖静态局部变量(如函数调用计数)、静态成员变量(如类共享数据)和静态成员函数的使用方法,并给出单例模式、对象计数等实际案例。此外还分析了静态变量的内存存储位置,包括全局变量、静态全局变量、静态成员和静态局部变量在内存中的分配情况。通过具体代码示例,全面展示了静态变量在C++编程中的多种应用方式。

2025-12-13 10:10:44 352

原创 C++实现完美洗牌算法

证明"真的乱"的黄金准则算法执行过程中产生的不同结果路径,必须有 n! 种可能。这个准则可以帮我们快速判断算法是否正确。

2025-12-05 11:06:45 791

原创 C++排序算法详解:掌握std::sort与std::stable_sort的核心技巧

C++排序算法比较:std::sort vs std::stable_sort 本文对比了C++标准库中的两种主要排序算法。std::sort采用内省排序(快速排序+堆排序+插入排序),平均和最坏时间复杂度均为O(N·log(N)),内存效率高但不保证相等元素的顺序稳定性。std::stable_sort通常使用归并排序,保持相等元素的相对顺序,但需要更多内存(O(N)),在内存不足时性能会下降至O(N·log²(N))。 选择建议:当元素唯一或顺序无关时使用std::sort以获得最佳性能;当需要多级排序

2025-12-05 10:12:32 530

原创 【操作系统入门】虚拟内存与页面置换

本文深入探讨了操作系统中的虚拟内存与页面置换技术。虚拟内存通过结合主内存和磁盘存储,为进程提供远大于物理内存的地址空间,实现内存隔离和高效文件映射。核心机制是按需分页,仅在访问时加载页面。当物理内存不足时,系统需选择牺牲页面换出,不同置换算法影响性能。理论最优算法(OPT)不可实现,实际常用近似算法如FIFO、LRU及其改进版本时钟算法。时钟算法通过循环检查引用位平衡开销与效率,改进型还考虑页面修改状态以优化I/O操作。这些技术共同实现了超越物理限制的内存管理"魔法"。

2025-11-22 23:16:23 482

原创 【操作系统入门】文件系统

文件系统:数据的持久化存储与管理 文件系统是操作系统中管理持久化数据的核心组件,它将物理磁盘空间组织为逻辑文件和目录结构。本章从基础概念出发,详细介绍了文件系统的核心抽象(文件、目录、路径名和元数据),并通过代码示例展示了文件控制块的结构和系统调用实现。随后深入探讨了三种磁盘空间分配策略:连续分配(简单高效但易产生碎片)、链接分配(通过链表连接数据块)和索引分配(使用多级索引节点)。重点分析了类Unix系统的inode结构及其寻址机制,包括直接指针、间接指针的计算方法。文件系统通过精妙的数据结构和算法,在物

2025-11-22 23:16:07 496

原创 【操作系统入门】设备管理与系统安全

设备管理与系统安全——硬件交互与安全防线

2025-11-22 23:15:52 611

原创 【操作系统入门】内存管理(一)

操作系统内存管理:分页与分段机制 本文探讨操作系统内存管理的核心机制,重点分析分页与分段技术。内存管理面临的核心挑战是如何高效分配有限物理内存,使多个进程共享资源且各自拥有独立地址空间的假象。文章首先介绍连续内存分配的三种策略(首次适应、最佳适应、最差适应)及其碎片化问题,随后深入讲解分页技术,包括页表结构、多级页表和TLB加速机制。分页通过将内存划分为固定大小的页/帧,配合页表实现虚拟到物理地址的映射,解决了连续分配的外部碎片问题。多级页表和TLB缓存则优化了地址转换性能。这些机制共同构成了现代操作系统高

2025-11-21 14:56:10 678

原创 【操作系统入门】死锁

今天,我们将面对并发系统中最令人头疼的问题——死锁,当多个进程陷入相互等待的僵局时,系统就会彻底停滞。< Rₙ < R₁,这是不可能的。, Pₙ〉,对于每个Pᵢ,它需要的资源可以被当前可用资源+所有Pⱼ(j < i)持有的资源满足。这就是死锁在现实世界中的完美写照——每个参与者都在等待别人释放资源,但谁也不愿先行动。由于所有进程都在相互等待,没有一个进程能够继续执行,系统陷入永久阻塞。,且该循环中涉及的资源类都只包含单个实例时,系统处于死锁状态。:如果进程请求资源被拒绝,则释放其当前持有的所有资源。

2025-11-21 14:52:29 839

原创 【操作系统入门】进程同步与通信

本文探讨了操作系统中的进程同步与通信问题,重点分析了临界区问题及其解决方案。首先通过银行账户竞态条件的例子说明了并发编程的核心挑战,随后介绍了软件解决方案Peterson算法和硬件原子操作。文章详细讲解了信号量机制及其在生产者-消费者、读者-写者、哲学家进餐等经典同步问题中的应用,强调了互斥、进步和有限等待三个关键要求。通过代码示例展示了如何正确实现进程同步,避免死锁和资源竞争问题。

2025-11-21 14:50:20 459

原创 【操作系统入门】进程调度算法

本文系统介绍了操作系统中的进程调度算法,包括基础概念、评估指标和经典算法实现。首先阐述了调度器的层次结构和关键性能指标(CPU利用率、吞吐量、响应时间等)。然后详细分析了先来先服务(FCFS)、最短作业优先(SJF)、轮转调度(RR)等经典算法,通过实例演示了调度过程和性能计算。最后介绍了现代操作系统广泛采用的多级反馈队列(MLFQ)机制及其优势,以及多处理器环境下的调度挑战。全文深入浅出地揭示了操作系统如何高效分配CPU资源这一核心问题。

2025-11-21 14:45:04 907

原创 【AI开发】一站式机器学习与数据分析指南

本文详细介绍使用VSCode构建Python AI开发环境的完整指南。文章首先分析了VSCode在AI开发中的核心优势,包括智能感知、丰富扩展生态和跨平台支持。随后详细讲解从基础安装到高级配置的全过程,包括Python环境搭建、包管理、Jupyter集成和AI编程工具配置。重点介绍了DeepSeek等AI辅助工具的高效使用技巧,以及数据处理、可视化和远程开发等实战场景。最后提供常见问题解决方案和完整的机器学习项目示例,帮助开发者一站式构建专业级AI开发环境。通过本文指导,读者可以快速搭建集高效性、智能化和可

2025-11-21 14:40:31 978

原创 【操作系统入门】进程与线程(一)

本文介绍了操作系统中的进程与线程概念。进程是一个正在执行的程序实例,包含代码、数据和系统资源,由进程控制块(PCB)唯一标识。进程经历新建、就绪、运行、阻塞和终止五种状态。线程作为轻量级进程,是CPU调度的基本单位,共享进程资源但有自己的执行流,解决了进程创建开销大、通信复杂等问题。线程实现有用户级、内核级和混合三种模型,各具优缺点。理解进程与线程的差异是掌握操作系统并发机制的关键基础。

2025-11-20 14:30:01 693

原创 【操作系统入门】演进与蓝图

本文概述了操作系统的演进历史和核心架构。操作系统的发展经历了手工操作、单道批处理、多道程序批处理、分时系统等阶段,驱动力始终是更高效地利用硬件资源。现代操作系统分为宏内核和微内核两种架构:宏内核将核心功能集中管理,性能高但稳定性风险大;微内核仅保留核心功能,其他服务独立运行,更可靠但性能开销大。混合内核如Windows和macOS则折中两者优势。理解操作系统的历史和架构有助于把握其设计哲学和技术权衡。

2025-11-20 10:42:38 820

原创 15分钟掌握Docker容器化部署

本文提供了Docker容器化部署的快速入门指南。主要内容包括:Docker核心概念介绍(镜像与容器)、环境安装配置、基础操作实战(运行Nginx容器、生命周期管理)、自定义镜像构建(Dockerfile编写)、Flask应用容器化实战,以及Docker Compose多容器编排。文章还提供了常用命令速查表和常见问题排查方法,帮助开发者在15分钟内掌握Docker基础,实现应用的快速容器化部署。通过实际示例演示了从开发到部署的完整流程,适合云原生时代的开发者快速上手容器技术。

2025-11-20 10:38:05 1300

原创 C++ Lambda 表达式深度解析

本文深度解析C++ Lambda表达式,从基础语法到高级特性全面剖析。Lambda是C++11引入的匿名函数特性,核心语法包含捕获列表、参数、返回类型和函数体。文章详细讲解了值捕获与引用捕获的区别,以及C++14引入的初始化捕获等新特性。高级特性部分涵盖泛型Lambda、constexpr Lambda和C++20模板Lambda等演进。实战应用场景包括STL算法优化、异步编程和回调函数实现。最后给出性能优化建议,如优先值捕获小型数据、避免默认捕获等最佳实践,并揭示Lambda底层通过编译器生成匿名类实现的

2025-11-20 10:21:41 1620

原创 【操作系统入门】启程!

本文开启《操作系统完全指南》系列,通过生活化比喻(大管家、交通指挥)解释操作系统(OS)作为"资源管理者"的本质功能:对下管理CPU、内存等硬件资源,对上为用户和应用程序提供统一接口。文章概述了10章学习路线,涵盖进程管理、内存分配、文件系统等核心内容,强调理解OS原理对解决实际技术问题的重要性。后续将从OS发展史开始,逐步深入计算机系统的底层运作机制。

2025-11-20 10:15:59 300

原创 彻底弄懂:什么是用户态和内核态?

摘要: 用户态和内核态是操作系统的核心概念。用户态是应用程序运行的低权限环境,无法直接操作硬件;内核态是操作系统内核运行的高权限模式,可直接控制硬件资源。两者通过系统调用进行切换,确保安全、稳定和抽象性。用户态程序需通过系统调用"陷入"内核态完成特权操作,切换过程存在性能开销。这种设计防止程序错误影响系统,并提供统一的硬件访问接口。理解二者区别对掌握计算机工作原理至关重要。

2025-08-20 09:54:23 744

原创 观察者模式你还不懂?!

观察者模式是一种行为型设计模式,建立对象间一对多的依赖关系。当主题(Subject)状态变化时,会自动通知所有注册的观察者(Observer)。主要包含四个角色:抽象主题(管理观察者列表和通知机制)、具体主题(维护状态)、抽象观察者(定义更新接口)和具体观察者(实现响应逻辑)。该模式通过解耦主题和观察者,实现了状态变化的自动传播,典型应用于事件处理、消息通知等场景。代码示例展示了C++实现的关键结构,包括观察者注册、状态更新和通知机制。

2025-07-21 16:42:55 252

原创 掌握现代C++核心新特性(上)

《现代C++核心特性精要》介绍了6项关键特性:1)智能指针工厂函数(make_unique/shared)提升内存安全与性能;2)移动语义高效转移资源所有权;3)四种类型转换运算符替代危险C风格转换;4)remove_pointer模板用于类型萃取;5)结构化绑定简化复合类型访问;6)filesystem库提供跨平台文件操作。这些特性从C++11到17逐步引入,优化了资源管理、类型安全、系统操作等核心场景,体现了现代C++在保持高性能的同时增强安全性与开发效率的设计理念。

2025-06-16 11:20:46 588

原创 清晰了解序列化的来龙去脉

本文介绍了序列化的概念与实现。序列化是将对象转换为可存储或传输的二进制数据的过程,反序列化则是将数据还原为对象。通过C++示例展示了Person结构体的序列化实现:使用字符串流将对象数据转换为特定格式字符串(包含ID、姓名长度、姓名和薪资),并通过同样方式重建对象。这种机制使对象能够方便地在网络中传输或持久化存储,完整保留了原始数据结构。代码示例演示了一个完整的序列化-反序列化工作流程,验证了数据转换的正确性。

2025-06-14 11:01:08 410

原创 什么是Gn?从零开始掌握GN构建系统

GN(Generate Ninja)是Google为Chromium项目开发的元构建系统,现已广泛应用于多个大型C++项目,如Fuchsia OS。GN通过生成Ninja构建文件实现高效的增量编译,其设计哲学强调速度、可读性和可维护性。核心优势包括极速构建、人性化语法、跨平台支持、精准依赖管理和灵活的条件编译。GN的语法类似Python,支持声明式配置,适合超大型项目。与CMake相比,GN在生成速度和学习曲线上更具优势,但跨平台支持需手动配置。GN还提供了丰富的进阶技巧,如条件编译、多工具链配置和性能优化

2025-05-20 15:37:24 878

原创 从零开始掌握Makefile:自动化构建的神奇工具

Makefile是类Unix系统中用于自动化构建的工具,通过定义文件依赖关系和构建规则,帮助开发者智能编译修改过的文件、管理多文件项目的复杂依赖、统一构建流程并减少重复编译时间。其基础语法结构包括目标、依赖和命令,命令必须以Tab开头。Makefile支持变量、通配符、自动变量、模式规则、伪目标声明和头文件依赖处理等核心功能,能够显著提升开发效率。通过使用条件判断、函数应用和多目录管理等高级技巧,开发者可以进一步优化构建流程。最佳实践建议包括并行编译、为不同环境编写条件规则、保持目标职责单一、添加帮助说明以

2025-05-14 17:24:28 481

原创 CMake入门与实践

CMake 是现代 C++ 项目构建的重要工具,通过简单的配置文件(CMakeLists.txt)生成跨平台的构建脚本,支持 Windows、Linux 和 macOS 等系统。其核心优势包括跨平台支持、简洁语法、模块化设计和丰富的生态系统。本文从安装 CMake 开始,介绍了如何创建最小项目示例,并详细讲解了 CMake 的核心概念,如项目结构组织、常用指令、变量与条件控制等。此外,还提供了进阶技巧,如多目录项目管理、集成第三方库和添加测试,并总结了最佳实践和常见问题排查方法。通过本文,读者可以快速掌握

2025-05-14 17:03:47 596

原创 深入理解C++智能指针:shared_ptr、unique_ptr与weak_ptr

C++11引入的智能指针(std::shared_ptr、std::unique_ptr和std::weak_ptr)通过RAII机制简化了内存管理,减少了内存泄漏和悬垂指针的风险。std::shared_ptr允许多个指针共享对象所有权,基于引用计数自动释放资源,但需注意循环引用问题。std::unique_ptr独占所有权,不可复制但可通过移动语义转移所有权,适合单一作用域内的资源管理。std::weak_ptr作为shared_ptr的观察者,不增加引用计数,用于解决循环引用问题。最佳实践包括优先使用

2025-05-13 11:51:32 1120

原创 从零开始学Git

本文为Git初学者提供了从零开始的详细指南,帮助解决代码版本管理、多人协作和代码安全等问题。文章首先介绍了Git的核心功能,包括版本控制、协作开发和代码备份,并强调了其广泛适用性。接着,详细讲解了如何在Windows、Mac和Linux系统上安装Git,并介绍了Git的核心概念,如仓库、提交和分支。通过手把手的实战教程,读者可以学习如何初始化仓库、添加文件、提交更改以及管理分支。此外,文章还介绍了如何连接远程仓库(以GitHub为例)并提供了常见问题的解决方案和命令速查。通过本文,新手可以在30分钟内掌握G

2025-05-09 09:06:12 1100

原创 工厂模式的三种类型

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类它通过多个抽象产品类来实现产品族的创建// 抽象产品Apublic:// 抽象产品Bpublic:// 具体产品A1public:std::cout << "使用产品A1" << std::endl;// 具体产品B1public:std::cout << "使用产品B1" << std::endl;

2025-04-21 14:41:32 433

原创 如何优雅地实现全局唯一?深入理解单例模式

单例模式是一种创建型设计模式,旨在确保一个类只有一个实例,并为该实例提供全局访问点,从而避免全局变量的命名污染,并支持延迟初始化Wikipedia。私有构造函数(禁止外部new创建)静态私有实例变量静态公有获取方法。

2025-04-20 23:57:41 791

原创 内部排序之插入排序

【代码】内部排序之插入排序。

2024-10-28 21:24:48 225 1

原创 并查集(Union-Find Set)介绍

并查集是一种数据结构,用于处理一些不相交集合的合并及查询问题。初始化并查集,使每个元素自成一个集合。查找某个元素所属的集合。将两个集合合并成一个集合。并查集常用于解决图论中的连通性问题,例如判断图中两个节点是否在同一个连通分量内。

2024-08-05 11:45:26 592

原创 树的存储结构

用数组顺序存储各个结点,每个结点中保存数据元素、孩子链表头指针。每个结点的孩子以单链表作为存储结构,n个头指针又采用顺序存储结构。每个结点内保存数据元素和两个指针,但是两个指针的含义与二叉树结点不同。双亲表示法采用一段连续空间来储存结点,并且在每个结点中创建一个伪指针,来储存双亲的位置。③最后是申明一个数组,存储各个结点的信息,并且记录结点数和根的位置。①先是创建链表结点,存储当前孩子编号,和下一个孩子指针。可以方便地实现数转换为二叉树的操作,易于查找结点的孩子。找双亲不方便,只能遍历每个链表。

2024-07-30 18:44:48 404

原创 二叉树链式存储

二叉树是一种树形结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树广泛应用于各种算法和数据结构中,如二叉搜索树、堆和哈夫曼编码等。int data;// 数据域// 左子节点指针// 右子节点指针} TreeNode;二叉树的链式存储是一种灵活且高效的实现方式,适用于各种需要动态插入和删除节点的场景。通过本文的介绍,相信大家对二叉树的链式存储有了更深入的了解。在实际应用中,可以根据具体需求选择合适的存储方式。希望这篇博客对你有所帮助,欢迎在评论区留下你的问题和见解!

2024-07-15 19:28:41 365 1

原创 基于hive数据库的泰坦尼克号幸存者数据分析

泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉。然而不幸的是,在它的处女航中,泰坦尼克号便遭厄运——它从英国南安普敦出发驶向美国纽约。(1)列名介绍PassengerID->乘客IDSurvived->是否生还Pclass->船舱级别Name->姓名Sex->性别Age->年龄SibSp->兄弟姐妹与配偶的总数Parch->父母和孩子的总数Ticket->船票IDFare->票价Cabin->舱室Embarked->出发港口。

2024-07-15 10:35:05 1665

原创 朴素模式匹配算法

朴素模式匹配算法是一种简单的字符串匹配算法,用于查找一个字符串(模式串)在另一个字符串(文本串)中的位置。该算法的时间复杂度为O(nm),其中n是文本串的长度,m是模式串的长度。朴素模式匹配算法虽然简单易懂,但在处理长字符串时效率较低。在实际应用中,通常会选择更高效的算法来进行字符串匹配。

2024-07-10 14:35:15 307

原创 字符串函数简单使用

字符串是编程中常见的数据结构。本文将介绍如何在C++中实现字符串的基本操作,包括初始化、长度获取、子串提取、字符串比较和字符串匹配,并通过代码示例展示这些操作。主函数展示了如何初始化字符串、插入元素、获取字符串长度和使用字符串匹配函数。来表示字符串,该结构体包含一个字符数组和一个整数表示长度。初始化字符串将字符数组清零并将长度设为0。在主串中查找子串的位置。我们定义了一个结构体。比较两个字符串的大小。从字符串中提取子串。

2024-07-07 20:46:42 191

原创 后缀表达式转前缀表达式

后缀表达式转前缀表达式。

2024-06-29 18:08:26 465

原创 括号匹配学习笔记

请编写一个程序检查表达式中的左括号是否匹配,若匹配,则输出。假设一个表达式有()、[]、{}三种括号组成。

2024-06-24 19:19:11 321

原创 链式队列的基本操作

通过以上代码示例,我们介绍了两种实现链式队列的方式。带头节点的链式队列实现起来更加简洁,而不带头节点的实现则更节省内存。具体选择哪种实现方式,可以根据实际需求和场景进行权衡。

2024-06-24 16:36:14 224

原创 循环队列的基本操作

通过以上代码示例,我们介绍了循环队列的实现方式。循环队列的优点是可以高效地利用数组空间,避免了因数组末尾空间不足而浪费的情况。

2024-06-24 14:17:36 840

原创 链式栈的基本操作

通过以上代码示例,我们介绍了链式栈的实现方式。链式栈的优点是动态内存分配,可以根据需要灵活地增加和减少栈的大小,避免了固定大小栈可能存在的内存浪费问题。

2024-06-19 15:37:10 330

空空如也

空空如也

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

TA关注的人

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