- 博客(83)
- 收藏
- 关注
原创 新手入门git操作----- 仓库创建,远端链接,分支管理等等
命令用于查看工作区和暂存区的状态,了解哪些文件被修改、新增或删除等,以及这些文件是否已经暂存。Git会⽤<<<<<<<,====== ,>>>>>>>来标记出不同分⽀的冲突内容。HEAD可以指向其他的分支,被指向的分支就是当前正在工作的分支(前面有* 号)。Git 标签是用来给仓库中的特定提交(commit)打上一个易记的、固定的标记。要想深刻理解git对文件的操作,就要谈一谈⼯作区、暂存区与版本库的概念。Git 会在冲突的文件中标记出冲突的部分。我们需要手动编辑冲突的文件,选择保留或修改冲突部分的代码。
2025-12-15 14:13:19
908
1
原创 Linux信号专题
因此,未决和阻塞标志可以⽤相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型 可以表⽰每个信号的“有效”或“⽆效”状态,在阻塞信号集中“有效”和“⽆效”的含义是该信号 是否被阻塞,⽽在未决信号集中“有效”和“⽆效”的含义是该信号是否处于未决状态。如果在调⽤信号处理函数时,除了当前信号被⾃动屏蔽之外,还希望⾃动屏蔽另外⼀些信号,则⽤sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时⾃动恢复原来的信号屏蔽字。发送信号的方式有很多种,但是最终,只能由OS向目标进程写信号。
2025-12-09 12:00:59
930
原创 Linux动静态库以及动静态链接
特性静态链接动态链接链接时机编译时运行时可执行文件大小大(库代码被复制)小(仅记录依赖)内存使用每个进程独立加载库多进程共享一份库库更新需重新编译程序替换.so即可(接口兼容)运行依赖无依赖.so存在且路径正确典型用途嵌入式、独立工具桌面系统、共享服务工具推荐ldd:查看依赖的共享库nm:查看符号表objdump:反汇编目标文件readelf:查看ELF文件结构。
2025-11-11 11:30:38
863
原创 C++进阶 之 基于逆波兰表达式的计算器实现
通过实现三个函数来对计算器进行了模拟实现,三个函数分开独立实现各自功能,提高了各自独立性,耦合度降低。
2025-10-21 10:27:22
816
原创 Linux之环境变量
环境变量是一种动态的值,它存储在操作系统中,用于影响程序运行时的行为。它们就像系统中的“全局变量”,在用户登录时或程序启动时被加载,并在运行过程中被程序引用。环境变量可以包含各种信息,比如文件路径、用户身份、语言设置等。举个简单的例子,PATH环境变量是一个非常重要的环境变量,它定义了系统在哪些目录中查找可执行文件。当你在终端输入一个命令时,系统会按照PATH中定义的顺序去查找这个命令的可执行文件。如果没有PATH环境变量,你可能每次都要输入完整的文件路径来运行一个程序,这显然是非常不方便的。
2025-10-13 18:57:57
1061
1
原创 Linux进程的状态
僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程,没有读取到子进程退出的返回代码时就会产生僵死(尸)进程僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
2025-09-25 11:05:41
1988
15
原创 Linux之父子进程fork
通过这段代码,我们可以清楚地看到fork()父进程创建了一个子进程。父进程和子进程分别执行不同的逻辑。父进程通过fork()的返回值获取子进程的 PID,而子进程通过fork()的返回值知道自己是子进程。这就是fork()的强大之处,它让一个进程能够轻松地创建出另一个几乎完全相同的进程,从而实现并发和多任务处理。
2025-09-16 08:26:29
2353
30
原创 Linux之GDB调试
GDB 是一个开源的、功能强大的调试工具,主要用于调试 C、C++ 等语言编写的程序。它支持多种操作系统和架构,能够帮助开发者在程序运行过程中暂停执行、查看变量值、修改程序状态等,从而快速定位和修复问题。断点是调试过程中非常重要的工具,它可以让程序在指定的位置暂停执行,方便我们查看程序状态。当程序出现异常时,查看调用栈可以帮助你了解程序的执行路径。它会从当前栈帧开始,向上列出所有调用栈帧的信息,包括函数名、文件名、行号等。如果你在启动 GDB 时已经指定了程序参数,可以直接输入。
2025-09-08 12:59:13
3804
42
原创 Linux自动化构建工具-make/Makefile
Make 是一个自动化构建工具,它根据 Makefile 中定义的规则来编译和链接程序。Make 的核心思想是:只重新构建那些发生了变化的文件,从而大大提高构建效率。Makefile 是一个文本文件,包含了一系列规则,告诉 Make 如何构建你的项目。一个简单的 Makefile 可能包含源文件、目标文件、依赖关系以及构建命令等信息。Make/Makefile 是 Linux 系统中强大的自动化构建工具,通过合理使用 Makefile 的各种特性,可以高效地管理复杂项目的构建过程。
2025-09-01 10:30:32
3845
49
原创 Linux权限的概念
目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd 进入目, 即使目录仍然有-r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
2025-08-21 10:45:52
2052
37
原创 Linux 编译器 gcc 与 g++
gcc全称 GNU Compiler Collection,是 GNU 项目开发的一款功能强大的编译器集合。它最初是作为 GNU C 语言编译器而开发的,随着不断发展,如今已支持 C、C++、Objective-C、Fortran、Ada 等多种编程语言。g++实际上是gcc的一个 “马甲”,它是gcc专门用于编译 C++ 代码的前端工具,通过调用gcc的底层编译功能,针对 C++ 语言的特性进行处理,以确保 C++ 代码能够被正确编译。1.1 make 工具。
2025-08-18 08:55:16
2453
34
原创 Linux基本指令(一)
Linux内核是操作系统的核心部分,负责管理计算机的硬件资源,如CPU、内存、磁盘等,并为应用程序提供运行环境。ls -F : 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通文件;-d:指定文件的时间戳为一个具体的日期或时间,格式更灵活。-a:仅修改文件的访问时间(Access Time),而不修改修改时间(Modify Time)。-m:仅修改文件的修改时间(Modify Time),而不修改访问时间。ls -a : 列出目录下的所有文件,包括以 . 开头的隐含文件。
2025-08-07 09:04:49
3600
38
原创 C++之智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使⽤的内存,⼀般是忘记释放或者发⽣异常释放程序未能执⾏导致的。内存泄漏并不是指内存在物理上的消失,⽽是应⽤程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因⽽造成了内存的浪费。
2025-08-04 09:48:07
1592
38
原创 C++之异常
除了使用标准异常类,开发者还可以根据自己的需求定义异常类。自定义异常类通常继承自或其派生类,并可以添加额外的成员变量和成员函数,以存储和提供更详细的异常信息。
2025-07-31 11:40:46
2247
31
原创 C++11之lambda及包装器
本文介绍了C++11中的两个重要特性:Lambda表达式和function包装器。Lambda表达式是一种匿名函数对象,支持捕获外部变量、参数传递和返回值定义,其底层实现实质上是编译器生成的仿函数类。function包装器是一个通用的可调用对象封装器,能够统一处理函数指针、仿函数、Lambda表达式等多种可调用对象,提供了更灵活的函数调用方式。两者结合使用可以简化代码编写,提高程序的可维护性和扩展性。
2025-07-28 07:32:22
1672
40
原创 C++11之可变参数模板
在我们的示例中,定义了一个参数包Args,它表示Print函数可以接受任意数量和类型的参数。定义了一个参数包Args,它表示Print函数可以接受任意数量和类型的参数。
2025-07-24 08:29:36
1467
26
原创 飞算JavaAI:基于知识库的深度测评,飞算AI 是如何帮助 Java 开发者提升效率的?
别再一行一行写代码了,试试飞算AI,让AI帮你写。
2025-07-22 07:20:17
813
13
原创 C++11之右值引用与移动语义(提高效率)重要
• 左值是⼀个表⽰数据的表达式(如变量名或解引⽤的指针),⼀般是有持久状态,存储在内存中,我们可以获取它的地址,左值可以出现赋值符号的左边,也可以出现在赋值符号右边。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。• 右值也是⼀个表⽰数据的表达式,要么是字⾯值常量、要么是表达式求值过程中创建的临时对象等,右值可以出现在赋值符号的右边,但是不能出现出现在赋值符号的左边,右值不能取地址。• 值得⼀提的是,左值的英⽂简写为lvalue,右值的英⽂简写为rvalue。
2025-07-21 08:17:54
2156
30
原创 C++11之列表初始化,以及initializer_list简介
列表初始化是一种使用花括号{}或者这种方式可以用于初始化各种类型的对象,包括内置类型、类类型、数组等。它旨在提供一种统一的初始化语法,以解决传统初始化方式中存在的问题,如初始化方式不一致、类型安全问题等。是一个模板类,用于表示初始化列表。它提供了一种方便的方式来处理一组同类型的数据。的对象可以通过花括号{}
2025-07-18 07:47:30
1453
29
原创 C++之unordered_xxx基于哈希表(链地址法)的自我实现(难)
Iterator:用于非常量哈希表的迭代器,允许修改元素。:用于常量哈希表的迭代器,不允许修改元素。
2025-07-16 08:52:28
1611
24
原创 C++之哈希表的基本介绍以及其自我实现(开放定址法版本)
当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加⼀个仿函数,这个仿函数⽀持把key转换成⼀个可以取模的整形,如果key可以转换为整形并且不容易冲突,那么这个仿函数就⽤默认参数即可,如果这个Key不能转换为整形,我们就需要⾃⼰实现⼀个仿函数传给这个参数,实现这个仿函数的要求就是尽量key的每值都参与到计算中,让不同的key转换出的整形值不同。比如,在一个存储用户信息的哈希表中,如果用户 ID 是连续的整数,且哈希表大小较小,那么相邻的用户 ID 很可能产生冲突。
2025-07-14 07:36:13
2166
27
原创 C++之unordered_set和unordered_map基本介绍
unordered_set 是一个不包含重复元素的集合容器。它通过哈希函数将元素映射到存储位置,从而实现快速的查找操作。由于元素的存储顺序是根据哈希值确定的,因此 unordered_set 中的元素顺序是无序的。由于unordered_set和set增删查以及使用基本一致,在这里就不做过多赘述unordered_map 是一个键值对的集合,其中每个键都是唯一的。它也基于哈希表实现,通过哈希函数将键映射到存储位置。与 unordered_set 类似unordered_map 中的元素顺序是无序的。
2025-07-10 08:11:07
2134
28
原创 C++之利用红黑树作为底层,实现对set和map的封装(难)
其次因为RBTree实现了泛型不知道T参数导致是K,还是pair<K,V>,那么insert内部进⾏插⼊逻辑⽐较时,就没办法进⾏⽐较,因为pair的默认⽀持的是key和value⼀起参与⽐较,我们需要时的任何时候只⽐较key,所以我们在map和set层分别实现⼀个MapKeyOfT和SetKeyOfT的仿函数传给RBTree的KeyOfT,然后RBTree中通过KeyOfT仿函数取出T类型对象中的key,再进⾏⽐较。返回一个 pair,其中 first 是一个迭代器,指向插入的节点或已存在的相同键的节点;
2025-07-07 08:53:25
1416
29
原创 C++之红黑树认识与实现
节点是红色或黑色:每个节点都有一个颜色属性,红色或黑色。根节点是黑色:树的根节点必须是黑色。叶子节点是黑色:叶子节点(即空节点或NULL节点)是黑色。红色节点的子节点是黑色:如果一个节点是红色,则它的两个子节点都是黑色。从任意节点到其每个叶子的所有路径都包含相同数量的黑色节点:这确保了树的平衡性。这些性质保证了红黑树在插入和删除操作后能够保持大致平衡,从而使得查找、插入和删除操作的时间复杂度都能保持在(O(log n))。
2025-07-03 08:37:54
5373
26
原创 C++之AVL树的介绍以及AVL树自我实现
AVL树是一种自平衡的二叉查找树,它的名字来源于它的发明者G.M. Adelson-Velsky和E.M. Landis。AVL树是最先发明的⾃平衡⼆叉查找树,AVL是⼀颗空树,或者具备下列性质的⼆叉搜索树:它的左右⼦树都是AVL树,且左右⼦树的⾼度差的绝对值不超过1。AVL树是⼀颗⾼度平衡搜索⼆叉树,通过控制⾼度差去控制平衡。
2025-06-30 13:02:13
1639
30
原创 C++之STL---set及map的基本使用
序列式容器是一种按照元素插入顺序存储数据的容器。元素存储在连续或逻辑上连续的空间中,通过索引或迭代器可以顺序访问每个元素。常见的序列式容器包括数组、向量(vector)、列表(list)、双端队列(deque)等。元素按照插入顺序依次存储。例如,在vector中,元素存储在连续的内存空间中;在list中,元素通过指针或引用连接在一起。存储结构相对简单,主要关注元素的顺序和连续性。关联式容器是一种基于键值对存储数据的容器。
2025-06-26 08:13:39
1992
29
原创 C++之二叉搜索树及其实现
搜索二叉树(Binary Search Tree,简称BST)是一种基础且重要的数据结构,它在查找、插入和删除操作上具有高效性。本文将围绕搜索二叉树的原理,结合C++代码实现,深入探讨这一数据结构的核心特性与具体实现。
2025-06-23 09:40:58
2934
37
原创 C++之多态
多态(Polymorphism)是面向对象编程的三大核心特性之一(封装、继承、多态),源于希腊语"多种形态"。在C++中,它允许我们使用统一的接口处理不同类型的对象,显著提高了代码的灵活性和可扩展性。核心概念同一接口,多种形态不同的对象可以通过相同的方法名调用,但实际执行的逻辑由对象自身的类决定。解耦调用与实现调用者只需关注接口(方法名和参数),无需关心具体实现,提高代码的可扩展性和可维护性。多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。
2025-06-18 10:16:57
2979
38
原创 C++之继承
继承允许我们基于已有的类(基类)创建新类(派生类)。派生类自动获得基类的成员(属性和方法),并可以扩展新的功能。继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段,它允许我们在保持原有类特性的基础上进⾏扩展,增加⽅法(成员函数)和属性(成员变量),这样产⽣新的类,称派⽣类。继承呈现了⾯向对象程序设计的层次结构,体现了由简单到复杂的认知过程。public:protected:string _name = "张三";// 姓名// 地址// 电话// 年龄。
2025-06-16 09:32:42
1657
19
原创 C++之模板进阶
模板的分离编译是一个复杂的问题,主要原因是模板的实例化依赖于具体的类型参数。显式实例化:通过显式指定模板的实例化类型,将模板代码集中到一个编译单元中,减少重复编译和代码膨胀。模板定义与声明分离:将模板的定义放在源文件中,声明放在头文件中,但需要显式实例化,否则可能导致链接错误。内联模板库:将模板的定义和声明全部放在头文件中,简单易用,但会导致编译时间增加和代码膨胀。优点模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性缺陷。
2025-06-14 09:23:53
1476
30
原创 C++之容器适配器介绍 以及 STL--stack queue deque
容器适配器数据结构特点默认底层容器适用场景stackLIFOdeque递归模拟、表达式求值queueFIFOdeque任务调度、广度优先搜索优先级排序vectorheap任务调度(按优先级)、贪心算法选择合适的容器适配器可以提高代码的可读性和性能。在 C++ 中,stack是一种容器适配器,它提供了一种后进先出(Last In First Out,LIFO)的数据结构。它基于底层容器(默认是std::deque,也可以是或std::list等)来存储元素,但只允许在容器的一端(称为栈顶)进行操作。
2025-06-12 08:18:05
1462
12
原创 C++之list的自我实现
{ }// 指向前驱节点// 指向后继节点T _val;// 存储的数据值核心作用:作为链表的基本单元,封装节点数据和指针关系// 封装的节点指针模板参数解析T:节点数据类型Ref:引用类型(T&或const T&)Ptr:指针类型(T或const T// 元素计数器// 哨兵头节点。
2025-06-09 18:55:15
2829
29
原创 C++之STL--list
它在内存中以连续的方式存储元素,支持快速的随机访问,但在插入和删除操作(尤其是非尾部操作)上可能效率较低。迭代器失效是指迭代器不再指向有效的元素,这通常发生在对容器进行修改操作时。它提供了高效的插入和删除操作,非常适合需要频繁动态调整元素的场景。是一个动态容器,其容量会根据元素的添加和删除自动调整。每个元素通过指针(或引用)与前一个元素和后一个元素相连。是一个双向链表,因此它提供的是双向迭代器。:当你删除一个元素时,指向该元素的迭代器会失效。是一个双向链表,插入操作不会影响已有的元素位置。
2025-06-07 13:53:10
1490
30
原创 C++ 之 vector的自我实现
/ it 指向尾后位置// 删除 3// 错误!it 失效,end() 已改变扩容情况:所有迭代器(包括begin()和end())全部失效非扩容情况:插入点及之后的迭代器失效。
2025-06-04 08:39:15
1612
12
原创 C++之动态数组vector
可以通过多种方式定义和初始化。// 定义一个空的 vector// 使用初始化列表初始化// 使用默认值初始化// 10个元素,初始值为0// 复制构造// 从另一个 vector 的一部分构造是 C++ STL 中非常重要的容器之一,它结合了动态数组的灵活性和数组的高效性。通过动态扩展、随机访问和灵活的内存管理,可以满足多种编程需求。在实际开发中,合理使用可以提高代码的可读性和性能。
2025-06-02 09:27:29
2605
48
原创 C++之string的模拟实现
通过手写这个简易版string类,我们深入理解了标准库字符串类的核心机制:动态内存管理、深拷贝实现、迭代器设计、扩容策略等。虽然现代C++编程中应优先使用,但掌握这些底层原理有助于写出更高效、更安全的代码。
2025-05-30 07:16:48
1622
15
原创 C++之string题目练习
leetcode题目链接:https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/description/在编程中,字符串与整数的转换是一个常见的任务。我们将通过分析一个具体的代码实现,来理解其中的关键点和技巧。我们的目标是将字符串中的单词顺序反转,但单词内部的字符顺序保持不变。函数可以实现这一功能,但今天我们通过手动实现一个类似的函数,来加深对这一问题的理解。接下来,我们需要将字符串中的数字字符转换为整数。
2025-05-28 08:46:24
1854
28
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅