- 博客(40)
- 收藏
- 关注
原创 C++的四种类型转换
实际表现取决于编译器实现:大多数编译器会简单存储该值(即使它不是有效的枚举值),但程序逻辑可能出错。更严重的情况可能导致值截断(如果超出基础类型范围)或意外行为。安全做法应始终在转换前验证数值是否在枚举有效范围内,或使用。
2025-07-16 14:52:05
1009
原创 C++STL:顺序容器vector,deque,list
在内存中存储为一段连续数组,支持O(1)时间的随机访问(通过下标或指针)。会自动申请更大的内存(VS默认按1.5倍扩容,g++可能按2倍)。扩容时需拷贝旧数据到新空间。:容量不足时按比例扩容(VS默认1.5倍,g++可能2倍)。(越界行为未定义,VS断言报错,Linux可能返回随机值)。底层为动态数组,支持O(1)随机访问(通过下标或迭代器)。:提前分配足够内存,避免反复扩容(拷贝旧数据)。:动态扩容、自动管理内存、提供边界检查。:大小固定、手动管理内存、无越界检查。:大小固定、手动管理内存、无越界检查。
2025-07-02 19:02:29
647
原创 数据结构(十四):B树
一个m阶的B树是具有以下性质的有根树:1.每个节点最多有m个子节点。2.根节点至少可以有2个子节点(除非它是叶子节点)。3.每个非根的内部节点至少有 「(m/2)个子节点。4.如果一个节点有k个关键字,那么它恰好有k+1个子节点。5.每个非根节点(内部和叶子)至少有「(m/2) - 1个关键字,至多有m-1个关键字。6.节点内的关键字按升序排列。7.对于任意关键字Ki,其左子树中的所有关键字都< Ki,其右子树中的所有关键字都>= Ki(或> Ki,取决于定义,需明确说明你的约定,通常用>=
2025-06-20 19:10:25
882
原创 数据结构(十三):红黑树
一棵红黑树是满足如下红黑性质的二叉排序树:① 每个结点或是红色,或是黑色的。② 根结点是黑色的。③ 叶结点(虚构的外部结点、NULL结点)都是黑色的。④ 不存在两个相邻的红结点(即红结点的父结点和孩子结点均是黑色的)。⑤ 对每个结点,从该结点到任意一个叶结点的简单路径上,所含黑结点的数量相同。假如给一个红黑树,最短路径长什么样子?最短路径肯定都是全黑的,一个红色节点都不要加入给一个红黑树,最长路径长什么样子?由于性质4"路黑同。
2025-06-17 18:24:12
2619
1
原创 数据结构(十二):平衡二叉树(AVL)
/AVL有效节点结构体设计//用递归实现//1.数据域//2.左孩子指针//3.右孩子指针int height;//4.节点高度}AVLNode;//注意:叶子结点的高度是0 空节点的高度认为是-1////用非递归实现//{//1.数据域//2.左孩子指针//2.5 双亲指针//3.右孩子指针//4.节点高度//}AVLNode;//AVL辅助节点结构体设计}AVLTree;
2025-06-17 14:52:50
1058
原创 数据结构(十一):二叉搜索树(BST)
是一种特殊的二叉树数据结构,满足以下性质:1.空树也是一颗二叉搜索树2.若二叉搜索树左子树不为空,则左子树上所有节点都小于根节点3.若二叉搜索树右子树不为空,则左子树上所有节点都大于根节点工4.二叉搜索树的左右子树也是二叉又搜索树5.所有节点的值互不相同。
2025-06-17 10:22:52
973
原创 C++类与对象(三)静态成员,单例模式
静态成员(Static Members)是与类本身关联而非类对象关联的成员,主要分为和。类名::变量名类名::变量名privateMath::PI分析以下加入const哪一个不可以编译通过。
2025-06-16 19:37:47
900
原创 C++类与对象(二)运算符重载,拷贝构造函数,移动构造函数
运算符重载允许我们为自定义类型(类或结构体)重新定义C++内置运算符的行为。当编译器遇到a + b这样的表达式时,它会检查操作数的类型,并调用相应的operator+函数。运算符重载是C++实现抽象数据类型的关键技术:通过成员/非成员函数两种形式实现赋值运算符、下标访问、流操作等有特定实现模式遵循一致性原则和资源管理规则合理使用可显著提升代码表达力正确使用运算符重载,能让你的自定义类型与内置类型无缝协作,写出如自然语言般优雅的C++代码。拷贝构造函数是一种特殊的构造函数,用于。
2025-06-11 15:27:29
681
原创 C++类与对象(一)封装,this指针,构造函数,析构函数
定义形式:析构函数是类的一种特殊成员函数 ,名字是在类名前面加符号,没有返回值,也没有参数,不能被重载。例如,对于类MyClass,其析构函数为~MyClass()。唯一性:一个类只能有一个析构函数。若用户未定义,编译器会自动生成一个默认析构函数。默认析构函数函数体为空,对于没有额外资源需要释放的类,默认析构函数通常能满足需求。
2025-06-10 17:39:57
971
原创 c++基础(五)new,delete
特性运算符new函数定位new内存分配自动分配并初始化仅分配,不初始化使用已有内存块返回值类型安全(无需强转)void*(需强转)指定类型指针异常处理抛抛不抛异常(依赖构造)释放方式delete手动析构(不释放)典型场景常规对象创建自定义内存管理内存池、硬件交互关键提醒:无论哪种形式,释放内存后必须将指针置为nullptr,避免野指针。
2025-06-04 14:39:44
813
原创 C++基础(六)auto,decltype,for循环,nullptr,typedef,string
1. 类型推导C++11 引入了 auto 和 decltype 关键字实现类型推导,通过这两个关键字不仅能方便地获取复杂的类型,而且还能简化书写,提高编码效率。C11 中 auto 成为类型指示符 (type - specifier)。auto 类型推导:auto 定义的变量,可以根据初始化的值,在编译时推导出变量名的类型。 必须初始化( 错误)。 推导结果会 "衰减":数组会转为指针,引用会转为值。2. 复合类型推导适用于类型复杂的场景:3. 与 const/vol
2025-06-04 14:39:10
801
1
原创 C++基础(四)缺省参数,重载,函数模版,名字空间
一般情况下,函数调用时的实参个数应与形参相同,但为了更方便地使用函数,C++ 也允许定义具有缺省参数的函数,这种函数调用时,实参个数可以与形参不相同。缺省参数指在定义函数时为形参指定缺省值(默认值)。这样的函数在调用时,对于缺省参数,可以给出实参值,也可以不给出实参值。如果给出实参,将实参传递给形参进行调用,如果不给出实参,则按缺省值进行调用。缺省参数的函数调用:缺省实参并不一定是常量表达式,可以是任意表达式,甚至可以通过函数调用给出。如果缺省实参是任意表达式,则函数每次被调用时该表达式被重新求值。
2025-06-03 20:58:44
1075
原创 C++基础(三):引用
左值:具有持久存储位置的对象,可被取地址(操作符),可重复使用。示例:变量、数组元素、解引用指针int a = 10;// a是左值// 可获取地址a = 20;// 可赋值右值:临时对象或字面量,无持久存储位置,不可取地址,仅存在于当前表达式。示例:字面量、函数返回的临时值、表达式结果// 10+5是右值func();// 函数返回的临时对象// &(10+5);// 错误:不能取地址练习一int main()int a = 10;// 定义整型变量a并初始化为10。
2025-05-30 21:13:54
621
原创 C++基础(二):const关键字
双重属性 —— 指针自身存储的地址值和它所指向对象的值,所以可用两个。修饰的变量被视为常变量(并不会变成常量),不能直接用于定义数组大小。的编译期常量替换机制,是理解 C++ 类型系统与编译原理的关键。),则两者均不可修改,这种双重修饰实现了对指针操作的精准约束。是指针),在表达式中是解引用符(访问所指对象),通过。取地址时仍保留变量属性,这种差异源于 C++ 对。修饰的整型变量在编译时会被直接替换为对应值(如。),限制所指向对象的值不可修改;),限制指针自身的地址不可修改;在声明时是类型修饰符(表明。
2025-05-27 11:21:56
463
原创 linux(十二):Redis数据库
NoSQL(Not Only SQL) 泛指非关系型数据库。1、NoSQL的特点方便扩展(数据之间没有关系)大数据量高性能(Redis写8w/s, 读11w/s,NoSQL的缓存记录级是一种细粒度的,性能会更高)数据类型是多样型的!不需要事先设计数据库,随取随用存储方式多样, 键值对,列存储,文档存储,图形数据库没有固定的查询语言2、NoSql的四大分类KV键值对新浪 Redis美团 Redis+Tair阿里 百度: Redis+Memcached。
2025-05-24 17:46:49
1002
原创 数据结构(十):树与二叉树
树是由 𝑛n(𝑛≥0n≥0)个结点构成的有限集合。当 𝑛=0n=0 时为空树;唯一根结点:存在且仅有一个无前驱的根结点;子集递归:当 𝑛>1n>1 时,其余结点划分为 𝑚m 个互不相交的子集 𝑇1,𝑇2,…,𝑇𝑚 每个子集本身也是一棵树,称为根的子树。树是递归定义的层次结构,除根结点外,每个结点有且仅有一个父结点(前驱),但可以有多个子结点(后继)。树中任意两结点间有唯一路径,且 𝑛个结点的树有 𝑛−1 条边。树也可视为连通且无环的无向图,或有向树中根入度为0、其他结点入度为1。定
2025-05-23 13:04:33
1188
1
原创 linux(十一):Libevent库
Libevent 是开源社区的一款高性能的I/O框架库,使用Libevent的著名案例有:高性能 的分布式内存对象缓存软件memcached,Google浏览器Chromium的Linux版本。作为一个 I/O 框架库,Libevent 具有如下特点:◼ 跨平台支持。Libevent支持Linux、Unix和Windows。◼ 统一事件源。Libevent对I/O事件、信号和定时事件提供统一的处理。◼ 线程安全。Libevent使用libevent_pthreads 库来提供线程安全支持。
2025-05-18 13:52:10
619
原创 mysql安装和使用
是存放数据的仓库,它是一个按数据结构来存储和管理数据的计算机软件系统。是数据库系统的核心组成部分,主要完成对数据库的操作与管理功能,例如实现数据 的存储,查询,修改,删除,及数据库用户的管理,权限管理等。关系数据库管理系统(Relational Database Management System)。结构化查询语言(Structured Query Language). mysql数据库是一种C/S模型(即客户端和服务端模型),客户单通过用户名,密码登录连接服务器。
2025-05-18 13:49:03
1381
原创 linux(十):IO复用的三个函数
select系统调用的用途是:在一段指定时间内,监听用户感兴趣的文件描述符的可读、 可写和异常等事件。select成功时返回就绪(可读、可写和异常)文件描述符的总数。如果在超时时间内 没有任何文件描述符就绪,select将返回0。select失败是返回-1.如果在select等待 期间,程序接收到信号,则select立即返回-1,并设置errno为EINTR。maxfd参数指定的被监听的文件描述符的总数。它通常被设置为select监听的所 有文件描述符中的最大值+1。
2025-05-16 16:02:46
846
原创 linux(九):HTTP与Web服务器
浏览器与Web服务器基于(应用层)通信时,需先通过将用户输入的域名转换为服务器IP地址,并默认使用(HTTP)或(HTTPS)。双方通过建立可靠连接后,浏览器发送HTTP请求报文,服务器返回响应报文;若多次请求复用同一TCP连接(如HTTP/1.1默认的),可避免重复握手开销,减少网络延迟和资源消耗,提升传输效率;反之,每次请求后断开连接的因频繁重建TCP链路,性能较差,适用于低频或简单场景。常见的web服务器有:◼ Apache: 简单、速度快、性能稳定,并可做代理服务器使用。
2025-05-14 16:41:20
855
原创 数据结构(九):排序
排序算法平均时间复杂度空间复杂度稳定性特点冒泡排序O(n²)O(1)稳定实现简单,效率低选择排序O(n²)O(1)不稳定交换次数最少插入排序O(n²)O(1)稳定适合小规模数据希尔排序O(n log n)O(1)不稳定改进的插入排序归并排序O(n log n)O(n)稳定稳定但需要额外空间快速排序O(n log n)O(log n)不稳定综合性能最优堆排序O(n log n)O(1)不稳定原地排序,适合大数据基数排序。
2025-05-13 16:11:25
1123
原创 linux(八):Socket网络编程
Socket网络编程是Linux应用开发的核心技能之一,广泛应用于服务器、客户端通信及分布式系统中。本文基于《Linux平台应用开发教程V5》第13章内容,结合实战代码与关键概念解析,帮助读者掌握Socket编程的核心技术。主机字节序:CPU处理数据的顺序,分为大端序(高位在前)和小端序(低位在前)。网络字节序:TCP/IP协议规定使用大端序,确保跨平台数据一致性。2. 套接字地址结构2.1 通用结构体socket 网络编程接口中表示 socket 地址的是结构体 sockaddr,这是所有地
2025-05-12 09:01:38
106
原创 数据结构(八):KMP
字符串匹配是计算机科学中的经典问题,广泛应用于文本搜索、基因序列分析等领域。传统的暴力匹配算法(Brute-Force)虽然简单,但在最坏情况下时间复杂度高达 (O(m*n))((m) 为模式串长度,(n) 为主串长度),效率低下。
2025-04-29 15:14:13
944
原创 数据结构(七):哈希表,一致性哈希和布隆过滤器
哈希表的冲突是指在使用哈希表进行数据存储时,不同的输入(键)通过哈希函数映射到同一个哈希值或同一个哈希表索引位置的情况。换句话说,即使两个键是不同的,它们的哈希值可能相同,导致它们在哈希表中存储时被分配到同一个存储位置例如,若哈希函数为 𝐻(𝑘𝑒𝑦)=𝑘𝑒𝑦%10H(key)=key%10,关键字11和21会映射到地址1,此时需处理冲突布隆过滤器(Bloom Filter)是 1970 年由布隆提出的,是一种非常节省空间的概率数据结构,运行速度快,占用内存小,但是有一定的误判率且无法删除元
2025-04-26 23:08:10
1143
原创 linux(六):进程间通信(IPC)
示例代码sem.c//全新创建,if( -1 == semid )//失败,说明已存在return;//映射到进程地址空间exit(1);sem_init();shmdt(s);exit(0);exit(1);
2025-04-24 23:21:25
1104
原创 Linux(七):多线程
线程(Thread)是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。一个进程可以创建多个线程,这些线程共享进程的资源。线程与进程关系示意图线程的实现方式:在操作系统中,线程的实现有以下三种方式:内核级线程用户级线程组合级线程。
2025-04-24 23:19:59
673
原创 数据结构(六):栈和队列的应用
若该项是操作符<op>,则从栈中退出两个操作数Y和x,形成运算指令X<op>Y,并将计算结果压入栈中。2)获得了第2个括号“(”,此时第1个括号“[”暂时放在一边,而急迫期待与之匹配的第7个括号“)”出现。假设表达式中允许包含两种括号:圆括号和方括号,其嵌套的顺序任意即([](()或[([][])]3)获得了第3个括号“[”,此时第2个括号“(”暂时放在一边,而急迫期待与之匹配的第。若为“(”,则直接入栈;2)若是左括号,则作为一个新的更急迫的期待压入栈中,自然使原有的栈中所有未消解的。
2025-04-20 20:31:51
1313
1
原创 数据结构(四):栈
栈中的元素具有线性关系,即除了第一个和最后一个元素外,每个元素都有唯一的前驱和后继。与一般线性表不同的是,栈对元素的操作仅在栈顶插入、删除,有 “后进先出” 特性。
2025-04-18 21:59:30
706
原创 数据结构(二):单链表
线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素。为了建立数据元素之间的线性关系,对每个链表结点,除存放元素自身的信息之外,还需要存放一个指向其后继的指针。本实现采用带头节点的单链表,头节点作为辅助节点简化操作逻辑。单链表相较于顺序表而言,要求逻辑地址相邻,而物理地址不相邻。单链表结构示意图。
2025-04-15 18:09:11
599
原创 数据结构(三):双向链表
/ 数据域// 存储下一个有效节点的地址// 存储上一个有效节点的地址} DNode;data: 存储元素值prior: 指向前驱节点next: 指向后继节点双向链表通过头节点维护,支持高效的头尾操作。插入删除需调整四个指针,确保链表完整性。内存管理需及时释放节点,避免泄漏。应用场景: 频繁双向遍历、需要快速头尾操作的场景。
2025-04-15 17:25:00
512
原创 linux(五):信号
程序接收两个参数(进程 ID 号和信号代号,传入时为字符串),需进行字符串到整形的转换,然后调用 kill 系统调用发送信号。系统的 kill 命令默认发送 15 号信号,也可指定发送其他信号(如 kill -2 发送 2 号信号,kill -9 发送 9 号信号)。子进程结束后会给父进程发送 SIGCHLD 信号(17 号信号),默认情况下父进程收到此信号不做任何响应(类似忽略),也可设置为忽略或自定义响应方式。信号时,不再按照默认方式(通常是终止程序)处理,而是会调用。信号,默认行为是终止进程。
2025-04-14 22:21:08
855
原创 linux(三):如何在Linux中创建和使用静态库与共享库
本文将详细介绍Linux环境下静态库和共享库的创建与使用方法,并通过实际案例演示两者的差异及应用场景。
2025-04-13 17:32:40
840
原创 linux(二):C程序的编译与调试
GCC(,GNU 编译器集合)是 GNU 项目开发的一套开源编译器工具,支持多种编程语言(如 C、C++、Objective-C、Fortran、Ada、Go 等)。是 Linux 系统的默认编译器,同时支持跨平台开发,广泛应用于嵌入式系统、操作系统和各类软件项目中。那么gcc分为四步编译1.预编译:展开头文件和宏2.编译:生成汇编代码3.汇编:生成目标文件4.链接 :生成最终可执行文件hello.c通常一步到位:gcc hello.c -o hello # 直接生成可执行文件。
2025-04-13 13:22:12
1054
原创 linux(一):常见命令
Ubuntu系统默认安装vi,vim需要用户自己安装,vim是vi的升级版,它不仅兼容vi的所有指令,而且还有一些新的特性,例如vim可以撤消无限次、支持关键词自动完成、可以用不同的颜色来高亮代码,所以通常使用vim。:启动 vi/vim 后默认进入的模式,所有命令在此模式下执行。(下方新行插入)等进入,按。:split 文件名。
2025-04-12 21:50:02
549
原创 数据结构(一):顺序表
顺序表是线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素,支持随机存储假设顺序表L存储的起始位置为LOC(A),sizeof(ElemType)是每个数据元素所占用存储空间的大小,则表L所对应的顺序存储如图所示//不定长顺序表的结构体设计,采用动态分配//指向 ELEM_TYPE 类型的指针,用于存储顺序表的首地址。int length;//表示顺序表当前实际存储的元素个数。//代表顺序表当前分配的存储空间大小。
2025-04-12 21:05:30
574
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅