- 博客(61)
- 收藏
- 关注
原创 Linux vim基础操作指南
Vim是一款功能强大的文本编辑器,本文介绍了其基本操作指南。主要内容包括:三大模式(正常/插入/末行)的切换方法;光标移动、删除复制、替换撤销等常用命令;多行注释、批量替换等实用技巧;以及基础配置文件设置。Vim通过不同模式实现高效编辑,在终端开发中具有不可替代的优势。掌握这些基础操作后,用户能显著提升文本编辑效率,为后续深入使用Vim打下坚实基础。
2025-07-08 09:25:16
505
原创 Linux 软件包管理器
Linux系统通过软件包管理器(yum/apt)简化了软件安装过程。软件包是预编译好的程序,类似于Windows的安装包。包管理器自动从内置服务器链接下载软件,国内镜像站点提供加速访问。常用操作包括:1)使用yum list | grep查找软件包;2)yum install安装软件,需sudo权限;3)yum remove卸载软件。所有操作需要网络连接,系统内置下载链接并自动处理依赖关系。软件包名称包含架构、版本和操作系统标识信息。
2025-07-08 09:23:46
197
原创 Linux 权限详解
本文系统介绍了Linux系统中的用户切换与权限管理机制。用户切换部分详细讲解了使用su、sudo等命令在不同用户身份间切换的方法。权限管理方面,重点阐述了文件与目录权限的差异、权限构成(r/w/x)、用户角色关系(拥有者/组/其他)以及权限判定规则。文章还深入解析了chmod、chown、chgrp等权限修改命令,并介绍了umask默认权限机制和目录粘滞位的特殊作用。通过权限示意图和表格对比,清晰展示了不同权限对文件与目录操作的影响。
2025-07-07 09:28:45
711
原创 Linux基础知识基本指令(下)
本文介绍了Linux系统中常用的文本处理、文件压缩、远程传输和系统管理命令。主要内容包括:1) grep命令的文本搜索功能及常用选项;2) 文件打包压缩工具zip/unzip和tar的使用方法;3) 远程文件传输工具rz/sz和scp的操作示例;4) 系统信息查询工具uname和计算器bc的用法;5) 历史命令管理和关机操作;6) Shell作为用户与内核中介的运行原理,包括命令解析、环境管理和保护机制。这些命令涵盖了Linux日常运维的基本操作,适合系统管理员和开发人员参考使用。
2025-07-07 09:27:44
365
原创 Linux基础知识基本指令(中)
本文介绍了Linux系统中常用的文件操作命令。主要内容包括:1)文件查看命令(cat、less、more、head、tail)及其常用选项;2)文件操作命令(mv、echo)与重定向技巧;3)时间管理命令date的使用方法;4)文件查找命令find的基本用法。这些命令涵盖了日常文件查看、操作、时间管理和查找等核心功能,其中重点介绍了cat、less和find等实用工具,并强调了Linux"一切皆文件"的设计理念。掌握这些基础命令将大大提高Linux环境下的工作效率。
2025-07-06 10:23:05
459
原创 Linux基础知识基本指令(上)
本文介绍了Linux文件系统基础概念和常用命令。文件由内容和属性组成,目录呈树状结构,路径分为绝对路径和相对路径。详细讲解了ls、pwd、cd、touch、mkdir、rm等文件操作命令的使用方法,以及which、man、tree等系统工具的使用技巧。同时介绍了Tab补全、Ctrl+C终止等实用热键,并补充了文件通配符、类型标识和时间戳等扩展知识。这些内容涵盖了Linux文件系统的基本操作和实用技巧,适合初学者快速掌握Linux基础命令。
2025-07-06 10:22:37
799
原创 C++ 智能指针的使用和原理
C++智能指针通过RAII机制自动管理内存资源,解决了传统手动内存管理的泄漏和悬垂指针问题。标准库提供了三种智能指针:unique_ptr(独占所有权,高效轻量)、shared_ptr(共享所有权,引用计数)和weak_ptr(解决循环引用)。智能指针在构造时获取资源,析构时释放资源,支持指针操作符重载,并禁用隐式转换。其中shared_ptr采用堆上动态分配的引用计数机制,确保资源安全共享;weak_ptr不增加引用计数,需通过lock()安全访问资源。智能指针还支持定制删除器和new[]的特化版本,是现
2025-07-05 08:58:38
1106
原创 C++异常处理机制详解
本文介绍了C++异常处理的基本概念与机制。异常是程序运行时发生的意外情况,通过throw抛出、try-catch捕获处理。文章详细讲解了栈展开过程、异常继承体系设计、异常重新抛出、异常安全问题及解决方案。还介绍了C++11的noexcept规范和标准库异常类体系。异常处理机制能够分离错误处理代码与正常逻辑,提供更丰富的错误信息传递方式,是C++重要的错误处理手段。文中包含大量代码示例,展示了异常处理的实际应用场景。
2025-07-05 08:57:08
504
原创 C++11可变参数模板、包扩展和emplace系列接口详解
本文介绍了C++可变参数模板的基本语法、原理及应用。主要内容包括:1) 基本语法使用...表示参数包,支持值传递、左值引用和通用引用版本;2) 参数包类型分为模板参数包和函数参数包,可通过sizeof...计算参数个数;3) 包扩展机制,包括递归展开和复杂包扩展模式;4) emplace系列接口的高效实现原理,通过完美转发直接在容器内部构造对象,避免了临时对象的构造和拷贝/移动开销。可变参数模板为C++提供了更灵活的模板编程能力和更高效的对象构造方式。
2025-07-04 09:17:28
231
原创 C++11新的类功能、STL变化、Lambda表达式和包装器详解
规则与移动构造类似,如果没有自己实现移动赋值重载,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个,编译器会自动生成默认移动赋值。:如果没有自己实现移动构造函数,且没有实现析构函数、拷贝构造、拷贝赋值重载中的任意一个,编译器会自动生成默认移动构造。:允许修改值捕捉的变量,不影响外部变量(了解即可,不常用):显式指示编译器生成默认版本。在继承和多态博客中已经讲解。:禁止编译器生成特定函数。
2025-07-04 09:16:26
989
原创 C++11 发展概述、列表初始化、右值引用与移动语义
摘要: C++11是C++的重要版本更新,引入了多项关键特性。1) 列表初始化:统一初始化语法{}支持所有类型初始化,避免解析歧义,并防止窄化转换;通过std::initializer_list实现容器便捷初始化。2) 右值引用:区分左值/右值,右值引用(Type&&)绑定临时对象,支持移动语义,提升资源转移效率;结合std::move实现资源所有权转移。3) 完美转发:利用万能引用(T&&)和std::forward保持参数值类别,解决多层函数调用中的属性传递问题,确保左值
2025-07-03 10:08:30
1093
原创 C++ unordered_map和unordered_set的使用(模拟实现)
C++标准库中的unordered_set和unordered_map是基于哈希表的无序关联容器,与红黑树实现的set/map相比具有更高效的查找性能(平均O(1))。本文分析了它们的底层实现差异、性能特点(通过实测对比插入/查找/删除操作)、迭代器特性以及使用场景选择建议。特别介绍了哈希表的关键配置参数(哈希函数、负载因子等),并提供了自定义类型作为键值的处理方案。对于需要允许重复键值的场景,标准库还提供了unordered_multiset和unordered_multimap变体。文章最后给出了一个简
2025-07-03 10:07:10
797
原创 C++ 红黑树封装实现map和set详解
文章摘要:该文分析了STL中set和map的源码框架,揭示其基于红黑树的实现原理。重点探讨了泛型设计、键值提取机制和操作一致性等核心思想,并详细说明了迭代器实现、operator[]等关键功能的模拟方法。针对类型安全、迭代器失效等问题提出了解决方案,最后通过完整代码示例展示了红黑树节点、迭代器和核心类的实现细节,总结了STL通过模板和泛型编程实现的高度复用设计模式。
2025-07-02 09:09:05
324
原创 C++ 哈希表全面详解(模拟实现)
哈希表(Hash Table)详解摘要 哈希表是一种高效的键值对存储结构,通过哈希函数将键映射到数组位置,实现平均O(1)的插入、删除和查找。核心内容包括: 1️⃣ 基本概念 直接定址法适用于小范围键,哈希函数压缩大范围键。 负载因子(α = 元素数/表大小)影响冲突概率。 2️⃣ 哈希函数设计 除法散列(key % M,M取质数)、乘法散列(黄金分割点优化)、字符串哈希(BKDR算法)。 3️⃣ 冲突解决 开放定址法:线性探测(易堆积)、二次探测(跳跃式)、双重散列(双哈希函数)。 链地址法:冲突键挂链表
2025-07-02 09:05:04
931
原创 C++ 红黑树实现详解
红黑树是一种高效的自平衡二叉搜索树,通过节点颜色标记(红/黑)和五大平衡规则确保近似平衡,保证最坏情况下操作时间复杂度为O(logN)。其核心特性包括:最长路径不超过最短路径2倍,插入时通过变色和旋转(单旋/双旋)维持平衡。与AVL树相比,红黑树旋转次数较少,更适合频繁修改的场景。实现上,新插入节点默认红色,根据父节点和叔叔节点颜色进行不同调整:当叔叔为红色时仅需变色;否则需旋转配合变色。这种设计在保证性能的同时降低了维护平衡的开销。
2025-07-01 08:51:40
396
原创 C++ AVL树实现详解
AVL树摘要 AVL树是最早的自平衡二叉搜索树,通过平衡因子(右子树高度-左子树高度)确保左右子树高度差≤1,维持O(logN)操作效率。插入节点时,先按二叉搜索树规则插入,再向上更新平衡因子:若平衡因子变为±2,则通过左/右单旋等旋转操作恢复平衡。旋转分为四种类型:右单旋(左子树过高时提升左子节点)、左单旋(右子树过高时提升右子节点)等,遵循"保持搜索树性质、恢复平衡、降低高度"原则。AVL树严格平衡的特性使其查询效率稳定优于普通二叉搜索树。
2025-07-01 08:50:29
770
原创 C++ STL-map和set
C++ STL中的关联式容器map和set是基于红黑树实现的有序容器,具有高效的查找性能(O(logN))。set存储唯一键值,自动排序且不可修改元素值;map存储键值对,按键排序且可修改值。两者都支持插入、删除和查找操作,并可通过迭代器遍历。multiset和multimap是其允许键重复的版本。map常用作词频统计等场景,其[]运算符设计巧妙,可用于计数。关联式容器适用于需要保持有序或快速查找的场景,而无序需求时可选用基于哈希表的unordered系列容器。实际应用中,这些容器能有效简化编程复杂度,提升
2025-06-30 08:59:43
455
原创 C++ 多态机制详解
本文摘要:多态是面向对象编程的核心特性之一,分为编译时多态(函数重载/模板)和运行时多态(虚函数机制)。实现运行时多态需要继承关系、虚函数声明、函数重写和指针/引用调用。虚函数通过虚表机制实现动态绑定,派生类对象包含基类虚表指针并替换重写的虚函数地址。纯虚函数(抽象类)强制派生类实现接口。多态实现关键在于虚函数表,每个含虚函数的类拥有虚表,对象存储虚表指针,调用时通过指针查找对应函数地址。虚表存储在代码段,包含基类和派生类虚函数指针。
2025-06-30 08:57:30
974
原创 C++ 继承机制详解
摘要:本文介绍了面向对象编程中继承的核心概念与实践。继承允许派生类复用基类特性并扩展新功能,通过public继承可避免代码冗余。文章详细解析了继承中的访问控制规则(public/protected/private继承对成员可见性的影响)、基类与派生类的转换关系(切片现象)、作用域与名称隐藏问题,以及派生类默认成员函数的处理要点。特别探讨了如何设计不可继承的类(C++98构造函数私有化 vs C++11 final关键字),并分析了继承体系中友元关系和静态成员的特殊性(友元不可继承,静态成员共享)。文中包含丰
2025-06-29 08:48:42
878
原创 C++ 仿函数和模板进阶
仿函数(Function Object)是重载了operator()运算符的类对象,可以像函数一样被调用。相比普通函数,仿函数可以保存状态,作为模板参数,并且类型更安全。STL提供了多种内置仿函数如plus、greater等。非类型模板参数是编译期常量,常用于指定数组大小等场景。模板特化分为函数特化和类特化,函数特化需先声明基础模板再特化,类特化包括全特化和偏特化(部分特化或指针/引用特化),用于针对特定类型提供特殊实现。
2025-06-29 08:47:24
237
原创 C++STL-栈-队列-优先队列-deque
push(): 将元素压入栈顶pop(): 弹出栈顶元素top(): 访问栈顶元素empty(): 检查栈是否为空size(): 获取栈中元素数量push(): 在队尾插入元素pop(): 从队首删除元素front(): 访问队首元素back(): 访问队尾元素empty(): 检查队列是否为空size(): 获取队列中元素数量适配器是一种设计模式,它将一个类的接口转换成客户希望的另一个接口。
2025-06-28 08:51:49
774
原创 C++STL-list详解(模拟实现)
list是STL提供的带头节点的双向循环链表非连续存储结构任意位置插入删除高效不支持随机访问迭代器类型为双向迭代器(vector为随机迭代器)操作说明empty()检查list是否为空size()返回元素个数front()访问第一个元素(不检查存在性)back()访问最后一个元素(不检查存在性)// 链表节点模板结构T _data;// 存储的数据// 指向下一个节点的指针// 指向前一个节点的指针// 节点构造函数,使用默认参数初始化:_data(x), // 初始化数据。
2025-06-28 08:49:11
984
原创 C++STL-vector详解(模拟实现)
C++ vector是STL中的动态数组容器,具有自动扩容、随机访问等特点。文章详细介绍了vector的基本概念、初始化方式(包括空vector、指定大小/值、列表初始化等)和常用操作(访问、修改、添加删除元素、大小容量管理)。重点分析了vector的空间增长机制(不同编译器扩容策略不同)和迭代器失效问题,包括扩容和删除操作导致的失效情况及正确处理方式。最后通过memcpy示例指出了浅拷贝可能引发的问题。vector是高效灵活的容器,但使用时需注意其特性以避免潜在问题。
2025-06-27 11:30:20
744
原创 C++string类详解(模拟实现)
C++的string类是标准库提供的字符串处理工具,比C风格字符串更安全高效。摘要包括:1)基本使用:包含头文件、声明初始化方式;2)常用操作:字符串连接、字符访问、比较和容量管理(size/reserve/resize等);3)输入输出与数值转换方法;4)遍历方式(下标、迭代器、范围for);5)VS和G++的底层结构差异;6)注意事项:自动内存管理、与C字符串互操作。最后提及实现时的深浅拷贝问题。总体介绍了string类的核心功能和特性。
2025-06-27 11:28:42
994
原创 C++模板初阶
class 类模板名// 类内成员定义// 类模版public:_size = 0;// 模版不建议声明和定义分离到两个文件.h 和.cpp会出现链接错误.// 扩容++_size;
2025-06-26 09:19:34
244
原创 C++内存管理
通过以下的例子我们可以看出,new/delete比malloc等不仅简单方便而且功能更多class Apublic:: _a(a)~A()private:int _a;int main()// new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数free(p1);delete p2;// 内置类型是几乎是一样的// Cfree(p3);delete p4;// 开辟多个内置类型。
2025-06-26 09:15:33
969
原创 C++ 二叉搜索树详解
二叉搜索树(BST)是一种高效的数据结构,具有有序性和递归结构,适用于动态数据存储与检索。其核心特性包括:左子树节点值小于等于当前节点,右子树节点值大于等于当前节点。BST的性能依赖于树的平衡性,最优情况下操作时间复杂度为O(log₂N),最差情况下退化为O(N)。BST支持插入、查找和删除操作,适用于纯Key和Key-Value场景,如车牌识别、单词拼写检查、中英字典和单词统计等。BST的优势在于不需要连续存储空间,支持高效动态操作,适用于内存数据组织。
2025-05-14 15:52:07
686
原创 C++类和对象(下)
C++中的构造函数初始化列表是一种高效的成员变量初始化方式,尤其适用于引用、const成员变量和没有默认构造函数的类类型变量。初始化列表按照成员变量在类中的声明顺序进行初始化,与列表中的顺序无关。C++11支持在成员变量声明时提供缺省值,这些值会在初始化列表中使用。静态成员变量和函数属于类而非对象,静态成员变量必须在类外初始化,静态成员函数没有this指针,只能访问静态成员。友元机制允许外部函数或类访问类的私有和保护成员,但应谨慎使用以避免破坏封装性。类型转换可以通过构造函数实现,但使用explicit关键
2024-11-29 11:01:46
1348
原创 C++类和对象(中)
析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会自动调用析构函数,完成对象中资源的清理释放工作。构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。1,2,3都不写编译器自动构造打印的结果。
2024-11-29 11:01:12
706
原创 C++类和对象(上)
以下面栈的代码为例class为定义类的关键字,Stack为类的名字,中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或者后面加或者m开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。
2024-11-28 17:48:18
636
原创 C++基础
1.定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。2.namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。3.C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找一 个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。
2024-11-25 17:32:07
711
1
原创 C++模板初阶
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。当我们显示实例化模板时,我们必须在所有使用的文件中包含显示实例化的代码,或者将它们放在一个单独的头文件中,并确保这个头文件被所有需要实例化的文件包含。显示实例化是程序员在代码中明确指定模板参数的类型,告诉编译器要实例化模板的特定版本。因此,通常显示实例化用于特定的模板参数,这些参数在多个源文件中需要,或者需要特别优化。
2024-08-10 15:37:27
892
原创 C++类与对象
类关键字:使用class关键字来定义一个类。类名:遵循命名规则,首字母大写。类的成员:包括数据和函数成员。访问修饰符:public、private 和 protected,用于定义类成员的访问级别。public:// 构造函数MyClass(int val) : privateValue(val) {}//初始化列表, 下面会讲// 析构函数// 成员函数private:// 私有成员这个例子中,MyClass是一个包含一个私有成员变量和两个公共成员函数setValue和。
2024-08-06 15:55:11
1149
原创 C++基础
在C++中,使用namespacenamespace 名称 {// 声明或定义变量、函数、类等 }在这个例子中,函数Print有一个参数number,它的默认值是0。这意味着如果你调用Print()而没有任何实参,函数将使用默认值0。引用的声明与指针类似,但它不需要使用星号。引用在声明时必须被初始化,一旦初始化之后,它就不能再绑定到另一个变量上。类型 &引用名 = 变量名;int a = 10;// 声明引用ref,并将其初始化为变量a的引用在这个例子中,ref是a。
2024-08-06 15:54:44
1160
原创 排序算法--快速排序
快速排序是一种由英国计算机科学家Hoare于1962年提出的排序算法,也就是Hoare法,后续有人认为Hoare法难以理解,又发明了“挖坑法”,“前后指针法”等(这些方法都叫快速排序),但其基本思想和复杂度等均与Hoare法大同小异,此篇博客我们重点讲解Hoare法。快速排序的基本思想是分治法。其核心是选择一个基准值(key),然后将待排序的数组分成两部分,使得左侧的所有元素都不大于基准值,而右侧的所有元素都不小于基准值。这个过程称为“划分”。
2024-07-29 14:48:29
949
原创 排序算法--堆排序
堆排序的基本思想是,将待排序的元素构建成一个最大堆或最小堆。然后,将堆顶元素与堆中最后一个元素交换,并从堆中移除这个最大或最小元素,再调整剩余的堆,使其满足堆的性质。建堆有向上调整建堆和向下调整建堆两种,使用向上调整建堆的时间复杂度为O(nlogn),而向下调整建堆的时间复杂度为O(n),所以我们选择向下调整建堆(向下调整详细请看我发布的堆博客)构建最大堆的时间复杂度是O(n),每次调整堆的时间复杂度是O(logn),由于需要调整n-1次,所以总的时间复杂度为O(nlogn)。
2024-07-28 11:07:42
337
原创 排序算法--选择排序
选择排序的基本思想是,通过在未排序的序列中找到最小(或最大)元素,并将其放置在已排序序列的起始(或末尾)位置。这个过程会一直重复,直到整个序列排序完成。选择排序不具有稳定性,即在排序过程中,相等元素的相对顺序可能会发生改变。这意味着如果有两个相同的元素,它们在排序后的序列中的相对位置可能与排序前不同。选择排序的时间复杂度为O(n^2),因为它需要对数组中的每个元素进行n-1次比较(n是数组的长度),且这个过程需要重复n-1次。选择排序的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。
2024-07-28 11:05:25
557
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人