- 博客(188)
- 收藏
- 关注
原创 【C++】:智能指针
C++中的智能指针是一种用于自动管理动态内存的工具,遵循RAII原则,确保资源在对象生命周期结束时自动释放,从而避免内存泄漏和悬空指针等问题。RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C++中管理资源的核心原则,通过对象的生命周期自动化资源管理,确保资源的获取与释放安全可靠。实现步骤// 封装资源到类class FileHandle {private: FILE* file;public: Fi
2025-03-25 19:28:35
464
原创 【C++】:异常
C语言处理错误的方式C++异常的概念C++ 异常处理是一种用于管理程序运行时错误的机制,它通过分离错误处理代码和正常逻辑来提高代码的可维护性。 try { // 可能抛出异常的代码 if (error) throw MyException("Error occurred");} catch (const MyException& e) { // 处理 MyException 类型异常 std::cerr << e.what() << std:
2025-03-21 21:11:27
797
原创 【C++】:C++11详解 —— 线程库
在C++11之前,涉及到多线程问题,都是和平台相关的,比如Windows 和 Linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行了支持,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。线程对象的构造函数C++11 中 std::thread 的构造函数是创建线程的核心接口,负责将可调用对象(如函数、Lambda 表达式、函数对象等)与参数绑定,并启动一个新线程执行。构造函数的用法示例// 基本语法template<
2025-03-20 16:27:19
774
原创 【C++】:C++11详解 —— 右值引用
可寻址性:左值对应具体的内存地址,可通过取地址操作符(&)获取其地址。int x = 10;int *p = &x; // x 是左值,可取其地址可修改性(除非被 const 限定):左值通常可被赋值,除非被声明为 const。 int a = 5;a = 20; // 合法,a 是左值const int b = 10;b = 30; // 非法,b 是 const 左值,不可修改 int x = 5; // x 是左值,5 是右
2025-03-18 22:43:13
808
原创 【C++】:C++11详解 —— 入门基础
C++11(原称 C++0x)是 C++ 编程语言的第三个国际标准(ISO/IEC 14882:2011),于 2011 年 8 月正式发布。它是自 1998 年 C++98 标准后的首次重大更新,引入了大量新特性,旨在提高代码效率、简化开发流程并支持现代编程范式。C++11 被广泛认为是 C++ 的“现代化重生”,推动了语言向更高抽象层级、更安全的资源管理和更强大的并发支持发展。C++11 的起源应对现代编程挑战C++03(2003 年小修订版)后,开发者逐渐发现语言在并发编程、泛型编程和资源管
2025-03-16 21:47:15
714
原创 【C++】:STL详解 —— 布隆过滤器
布隆过滤器(Bloom Filter) 是一种空间效率极高的概率型数据结构,用于快速判断一个元素是否属于某个集合。其核心特点包括:空间高效:基于位数组(bit array)实现,占用内存远小于传统数据结构(如哈希表)。概率性判断:可能返回“可能存在”(存在误判,即假阳性),但绝不会返回“肯定不存在”(无假阴性)。不可删除:标准布隆过滤器不支持元素删除,但改进版(如计数布隆过滤器)通过替换位为计数器可实现删除功能。工作原理:数据结构:使用一个长度为 m 的位数组(bit array),
2025-03-15 17:40:55
771
原创 【C++】:STL详解 —— 位图(bitset)
位图(Bitmap)是一种基于二进制位(bit)的高效数据结构,用于表示一组布尔值(存在或不存在、真或假)。它的核心思想是:用每一个二进制位(0或1)来标记某个状态或资源是否被占用。第 i 位为 1 → 表示第 i 个元素存在/被占用。第 i 位为 0 → 表示第 i 个元素不存在/未被占用。关键特性:内存高效:每个布尔值仅占用 1 个二进制位(bit),而非传统布尔变量(通常占用 1 字节)。例如:存储 1000 个布尔值:传统布尔数组:1000 字节(1 字节/布尔值)。位
2025-03-14 20:12:48
776
原创 【C++】:STL详解 —— 哈希表和哈希桶
哈希表通过哈希函数建立关键码与存储位置的直接映射,实现O(1)时间复杂度的快速查找,避免顺序结构(O(N))和平衡树(O(logN))的多次比较。核心机制哈希函数设计将关键码转换为固定范围的存储位置(如 hash(key) = key % capacity)。目标:均匀分布元素,减少冲突。插入与查找流程插入:计算关键码的哈希值,直接存放到对应位置。查找:通过哈希值定位到存储位置,比对关键码是否匹配。
2025-03-12 19:30:21
948
原创 【C++】:STL详解 —— unordered_set 和 unordered_map类
unordered_set 是 C++ 标准库中的一个容器,用于存储唯一元素,基于哈希表实现1. 基本特性唯一性:元素唯一,不允许重复。无序性:元素不按特定顺序存储,遍历顺序不确定。基于哈希表:通过哈希函数将元素映射到桶(bucket)中,提供平均 O(1) 的查找、插入和删除操作(最坏情况 O(n))。2. 实现原理哈希函数:每个元素通过哈希函数计算哈希值,决定其存储的桶位置。冲突处理:通常采用链地址法(每个桶内用链表管理冲突元素)。动态扩容:当负载因子(元素数 / 桶数)
2025-03-11 09:27:25
670
原创 【C++】:STL详解 —— 红黑树封装map和set
那能不能不要红黑树的第一个模板参数,只保留第二个模板参数呢?乍眼一看好像是可以的,因为此时红黑树的第二个模板参数当中也是有键值Key的,但实际上红黑树的第一个模板参数是不能省略的。对于set容器来说,省略红黑树的第一个参数当然没问题,因为set传入红黑树的第二个参数与第一个参数是一样的。但是对于map容器来说就不行了,因为map容器所提供的接口当中有些是只要求给出键值Key的,比如find和erase。
2025-03-09 21:52:07
282
原创 【C++】:STL详解 —— 红黑树
红黑树(Red-Black Tree)的核心理念源于对平衡二叉查找树的探索,其历史可追溯至20世纪70年代计算机科学的快速发展期。以下是其关键发展节点:1972年:德国计算机科学家鲁道夫·拜尔(Rudolf Bayer)提出对称二叉B树(Symmetric Binary B-Tree),这是红黑树的前身,旨在将B树的特性(多路平衡)引入二叉结构。1978年:美国计算机科学家罗伯特·塞奇威克(Robert Sedgewick)和莱昂尼达斯·J·吉巴斯(Leonidas J. Guibas)在论文《A
2025-03-08 16:34:51
1046
原创 【C++】: STL详解 —— set和map类
C++标准库提供了多种容器,用于高效管理和操作数据集合。这些容器可分为以下几类:顺序容器(Sequence Containers)关联容器(Associative Containers)容器适配器(Container Adapters)其他类容器类型set 是一个有序关联容器,存储唯一键(Key),键本身即为其值(没有额外的Value)。元素按键的严格弱序规则(默认升序)自动排序,不允许重复键。map 是一个有序关联容器,存储键值对(Key-Value Pair),其中键(Key)唯一
2025-03-06 23:21:05
1248
原创 【C++】:多态
特性重载(Overloading)重写(Overriding)重定义(Redefining)作用域同一作用域(类内/命名空间内)继承体系(基类→派生类)继承体系(基类→派生类)函数关系同名不同参同名同参,基类虚函数同名(参数可不同),基类非虚函数多态性编译时多态(静态绑定)运行时多态(动态绑定)无多态(静态绑定)关键字要求无virtualoverride无常见用途提供同一操作的多种实现实现多态接口修改基类非虚函数行为。
2025-03-06 00:43:02
952
原创 【C++】:继承
代码复用:子类继承父类的属性和方法,避免重复编写相同代码,提升开发效率。层次关系:体现“是一个(is-a)”关系,如“狗是动物”,子类是父类的特化。
2025-03-05 00:00:09
906
1
原创 【C++】:STL详解 —— priority_queue类
priority_queue 是 C++ 标准库中的容器适配器,用于实现优先级队列。优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。
2025-03-03 22:20:22
806
原创 【C++】:STL详解 —— stack和queue类
例如,std::stack默认基于std::deque,但也可选择vector或list。:仅暴露符合数据结构特性的操作(如栈的pushpoptop:用户无需关心内存管理,只需通过适配器的接口操作数据。
2025-02-27 20:58:02
563
原创 【C++】:STL详解 —— list类
可以将一个链表的元素移动到另一个链表中,无需复制元素。:通过移动另一个链表的资源初始化(高效转移所有权):扩展链表,新增元素默认初始化为。用于删除容器当中连续的重复元素。用于删除容器当中满足条件的元素。:返回指向第一个元素的迭代器。:返回指向第一个元素的迭代器。用于删除容器当中特定值的元素。获取list容器最后一个元素。通过另一个链表深拷贝初始化。示例 3: 移动元素区间。获取list容器第一个元素。示例 2: 移动单个元素。的迭代器(尾后迭代器)。的迭代器(尾后迭代器)。内的元素(左闭右开)
2025-02-27 00:02:23
984
原创 【C++】:STL详解 —— vector类
迭代器的主要作用就是让我们在使用各个容器时不用关心其底层的数据结构,而vector的迭代器在底层实际上就是一个指针。迭代器失效就是指迭代器底层对应指针所指向的空间被销毁了,而指向的是一块已经被释放的空间,如果继续使用已经失效的迭代器,程序可能会崩溃。:返回当前预分配的内存容量(可容纳的最大元素数)指向的元素,返回指向下一个元素的迭代器。:返回指向第一个元素的迭代器。:返回指向第一个元素的迭代器。:返回最后一个元素的引用。的迭代器(尾后迭代器)。的迭代器(尾后迭代器)。:返回第一个元素的引用。
2025-02-25 21:18:35
839
原创 【C++】:STL详解 —— string类
string 是 C++ 标准库中用于处理字符串的类,封装了字符串的常见操作,如拼接、查找、替换等,同时自动管理内存,避免了 C 风格字符数组的繁琐操作。
2025-02-14 17:23:45
613
原创 【C++】:内存管理(new和delete)
一、申请单个类的空间//申请delete p1;// 销毁new 和 delete 调用了构造函数和析构函数C语言://申请free(p1);//销毁malloc和 free 调用了构造函数和析构函数二、申请多个类的空间//申请//销毁free(p2);注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc和free不会。总结C++中如果是申请内置类型。
2025-02-08 21:31:55
974
原创 【C++】:类与对象
/ 类体:由成员函数和成员变量组成class 为定义类的关键字ClassName 为类的名字{ } 中为类的主体注意类定义结束时后面分号不能省略类体中内容称为类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或者成员函数类的两种定义方式一、声明和定义全部放在类体中二、声明放在头文件(.h)中,定义放在源文件(.cpp)中一般情况下,更期望采用第二种方式(声明和定义分离)
2025-02-08 20:09:19
683
原创 【网络】:网络编程套接字
可靠是需要我们做更多的工作的,TCP协议虽然是一种可靠的传输协议,但这一定意味着TCP协议在底层需要做更多的工作,因此TCP协议底层的实现是比较复杂的,我们不能只看到TCP协议面向连接可靠这一个特点,我们也要能看到TCP协议对应的缺点。进行封装时,就会添加上对应源端口号和目的端口号的信息。虽然是一种不可靠的传输协议,但这一定意味着UDP协议在底层不需要做过多的工作,因此UDP协议底层的实现一定比TCP协议要简单,UDP协议虽然不可靠,但是它能够快速的将数据发送给对方,虽然在数据在传输的过程中可能会出错。
2025-01-14 18:26:33
1054
原创 【MySQL数据库】:MySQL访问
因为我们下载的是Linux下使用的库文件,但是是下载在Windows下的,因此下载完毕后需要将其上传到云服务器。而动态库是包含可共享代码和数据的文件,是动态链接过程中被链接的对象。进入解压后 mysql-connector 的目录当中,可以看到有一个 include 子目录和一个lib子目录。因为我们是要使用C语言连接MySQL,所以这里选择MySQL Connector/C。要使用C语言连接MySQL数据库,需要使用MySQL官网提供的库。使用的是一个 main 的测试表 ,里面没有任何数据。
2024-12-15 23:07:46
679
1
原创 【Git】:企业级开发和多人协作开发啊
目录多人协作模拟配置多人协作环境多人同一分支开发多人不同分支开发远程分支删除后的问题企业级开发模型系统开发环境分支设计规范但是这些都是个人的操作,我们如何去实现多人协作开发呢?我们来使用在Linux 系统和Windows系统下的本地仓库来模拟实现多人协作开发为了模拟实现多人协作开发,我们需要先做⼀些准备工作:在 Linux 环境下,再克隆(clone) 同一个项目仓库 我们在拉取(pull)后使用 git branch 查看所有分支,但是发现查找不到拉取(pull)下来的分支 dev其实 git bran
2024-12-12 16:27:47
1212
原创 【Git】:标签管理
理解标签标签 tag,可以简单的理解为是对某次commit的⼀个标识,相当于起了⼀个别名。例如,在项目发布某个版本的时候,针对最后⼀次commit起⼀个v1.0这样的标签来标识里程碑的意义。相较于难以记住的 commit id, 标签(tag) 很好的解决这个问题,因为标签(tag) ⼀定要给一个让人容易记住,且有意义的名字。创建标签在Git中打标签非常简单:首先,切换到需要打标签的分支上查看所有标签git tag默认标签是打在最新提交的commit上的。
2024-12-08 16:00:20
640
原创 【Git】:远程操作
好在这个世界上有个叫 GitHub 的神奇的网站,从名字就可以看出,这个网站就是提供 Git 仓库托管服务的,所以,只要注册⼀个GitHub账号,就可以免费获得 Git 远程仓库。当我们从远程仓库克隆后,实际上 Git 会自动把本地的 master 分支 和 远程的 master 分支对应起来,并且,远程仓库的默认名称是 origin。SSH 协议时,使用了公钥加密 和 公钥登陆机制,体现了其实用性 和 安全性,使用此协议需要将我们的公钥放上服务器,由 Git 服务器进行管理。Gitee 来托管代码。
2024-12-07 23:55:55
1090
原创 【Git】:分支管理
分支在实际中有什么用呢?假设你准备开发⼀个新功能,但是需要两周才能完成,第⼀周你写了50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再⼀次提交,又存在丢失每天进度的巨大风险。现在有了分支,就不用怕了。你创建了⼀个属于你自己的分支,别人看不到,还继续在原来的分支上正常⼯作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别⼈⼯作。
2024-11-29 17:47:35
3156
原创 【Git】:Git基本操作
初次使用 git 需要设置你的用户名以及邮箱,这将作为当前机器 git 的标识,如果你用它来下载远程仓库一些需要登录权限的仓库会要求登录,git默认使用配置邮箱以及用户名登入,但会要求你手动输入密码。它主要用于比较不同版本的文件之间的变化情况,这些版本可以是工作区与暂存区、暂存区与最近一次提交、或者两个不同提交之间的文件内容差异。查看工作区和暂存区的状态:它会告诉你哪些文件被修改了、哪些文件是新添加的、哪些文件已经被放入暂存区准备提交,还有哪些文件没有被跟踪等信息。找到其中的提交标示,并且回退到之前版本。
2024-11-23 21:37:47
2941
2
原创 【网络】:网络基础
虽然客户端和服务端可能使用的是不同种类的操作系统,但每个操作系统实现网络协议栈的方法包括各种细节都是一样的,因此双方对数据进行的封包和解包操作都是一样的。
2024-10-24 16:38:28
857
2
原创 【Linux操作系统】:Linux信号量
内存当中变量的++、--操作并不是原子操作,因此信号量不可能只是简单的对一个全局变量进行++、--操作。)两个信号量的保护后,该环形队列中不可能会出现数据不一致的问题。在基于环形队列的生产者和消费者模型当中,初始化信号量的函数叫做。销毁信号量的函数叫做。等待信号量的函数叫做。发布信号量的函数叫做。空间资源(space)数据资源(data)
2024-09-11 16:49:46
912
原创 【Linux操作系统】:Linux生产者消费者模型
生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器当中,消费者也不用找生产者要数据,而是直接从这个容器里取数据,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。例如,我们想要实现一个基于计算任务的生产者消费者模型,此时我们只需要定义一个Task类,这个类当中需要包含一个Run成员函数,该函数代表着我们想让消费者如何处理拿到的数据。为了方便理解,我们以。
2024-09-03 20:17:21
1206
1
原创 【Linux操作系统】:Linux线程安全
临界资源:多线程执行流共享的资源叫做临界资源。临界区:每个线程内部,访问临界资源的代码,就叫做临界区。互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
2024-08-20 23:37:15
1057
原创 【Linux操作系统】:Linux多线程
一个进程的创建实际上伴随着,如下几个: 如果我们在创建“进程”时,只创建task_struct,并要求创建出来的task_struct和父task_struct共享进程地址空间和页表,那么创建的结果就是下面这样的: 此时我们创建的实际上就是四个线程:注意: 单纯从技术角度,现场是一定能实现的,因为它比创建一个原始进程所做的工作更轻量化了。 下面用红色方框框起来的内容,我们将这个整体叫做进程。不能,并且也不需要了。因为CPU只关心一个一个的独立执行流。无论进程内部只有一个执行流还是有多个执行流,CPU都是以进
2024-08-13 22:25:36
720
原创 【Linux操作系统】:Linux进程信号
实际上当用户按 Ctrl+C 时,这个键盘输入会产生一个硬中断,被操作系统获取并解释成信号(Ctrl+C被解释成2号信号),然后操作系统将2号信号发送给目标前台进程,当前台进程收到2号信号后就会退出。我们可以使用 signal 函数对2号信号进行捕捉,证明当我们按 Ctrl+C时进程确实是收到了2号信号。signal 函数 的详情如下:
2024-08-09 15:32:54
690
原创 【Linux操作系统】:进程间通信
进程间通信简称IPC(Interprocess communication),进程间通信就是在不同进程之间传播或交换信息。
2024-07-25 17:09:21
801
3
原创 【Git】:初识Git 和 Git 的安装
开始也只能应用于Linux平台,后⾯慢慢的被移植到windows下,现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。,从分支创建,切换,合并,删除的整个生命周期,灵活进行各种场景下的分支管理,学习常见分支管理策略。结合案例,引入工程师,测试人员,技术经理等角色,展现项目。出现像上⾯的结果,Linux会友好地告诉你Git没有安装,还会告诉你如何安装Git。,深刻理解Git操作过程与操作原理,理解工作区,暂存区,版本库的含义。再次安装Git,发现没有问题,可以安装成功!
2024-07-11 10:47:57
1132
2
原创 【MySQL数据据库】:MySQL用户管理
MySQL数据库与Linux操作系统类似,MySQL中也有超级用户和普通用户之分。如果一个用户只需要访问MySQL中的某一个数据库,甚至数据库中的某一个表,那么可以为其创建一个普通用户,并为该用户赋予对应的权限,而不让该用户看到数据库中的其他数据,防止该用户对其他数据进行误操作。
2024-06-23 10:57:03
875
1
原创 【MySQL数据库】:MySQL视图特性
视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。视图中的数据并不会单独存储在数据库中,其数据来自定义视图时查询所引用的表(基表),在每次引用视图时动态生成。由于视图和基表用的本质是同一份数据,因此对视图的修改会影响到基表,对基表的修改也会影响到视图。
2024-06-22 15:08:49
956
1
原创 【MySQL数据库】:MySQL事务管理
事务由一条或多条SQL语句组成,这些语句在逻辑上存在相关性,共同完成一个任务,事务主要用于处理操作量大,复杂度高的数据。比如转账就涉及多条SQL语句,包括查询余额(select)、在当前账户上减去指定金额(update)、在指定账户上加上对应金额(update)等,将这多条SQL语句打包便构成了一个事务。MySQL同一时刻可能存在大量事务,如果不对这些事务加以控制,在执行时就可能会出现问题。比如单个事务内部的某些SQL语句执行失败,或是多个事务同时访问同一份数据导致数据不一致的问题。
2024-06-21 17:08:54
1324
3
原创 OpenGauss数据库-9.模式管理
第1关:创建模式gsql -d postgres -U gaussdb -W 'passwd123@123';CREATE DATABASE test_db;\c test_dbpasswd123@123CREATE SCHEMA new_schema AUTHORIZATION gaussdb;CREATE TABLE new_schema.mytable (my_id int, my_info varchar(36));第2关:管理模式gsql -d test_db -U
2024-06-12 10:09:11
413
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人