自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++——线程库

set。

2026-04-11 23:15:42 2265

原创 C++——类型转换

本文对比分析了C/C++中的类型转换机制。C语言提供隐式转换(自动类型兼容)和显式强制转换两种方式,但存在可读性差、难以追踪的问题。C++引入四种类型转换操作符提高安全性:static_cast对标隐式转换,reinterpret_cast处理指针强制转换,const_cast去除const限定符(配合volatile防止优化),dynamic_cast实现安全的向下转型(需父类含虚函数)。这些转换操作符增强了代码可读性,使类型转换意图更明确,便于错误排查。其中dynamic_cast在运行时检查转换合法性

2026-03-25 22:30:04 3336

原创 序列化与反序列化

本文阐述了网络通信中序列化的必要性及其核心作用。序列化是将原始数据转换为通用格式的过程,以解决不同主机间的数据传输问题。主要原因包括:1)结构体内存对齐规则差异导致解析错误;2)大小端字节序问题;3)数据类型长度不一致;4)指针地址传输无效;5)TCP字节流特性导致的粘包/拆包问题。通过序列化,可以确保数据在不同主机间正确传输和解析,如添加长度前缀解决TCP传输问题,转换网络字节序统一数据格式等。序列化是网络通信中确保数据完整性和正确性的关键技术。

2026-03-22 21:42:38 2056

原创 Linux——文件

本文摘要:文章探讨了操作系统中的文件管理机制,指出文件由内容和属性组成,分为打开和未打开两类。打开的文件由进程管理,通过内核中的文件对象以链表形式组织;未打开的文件存储在磁盘上,需高效管理。C语言程序默认打开stdin、stdout、stderr三个流,这是操作系统特性而非语言特性。文章还分析了文件操作接口如fopen、fwrite,以及重定向符号">"和">>"的底层实现机制,指出它们分别对应"w"(清空写入)和"a&

2026-03-20 23:13:40 2335

原创 哈希桶——模拟实现哈希表

哈希桶(开散列法/链地址法)是一种哈希冲突解决方法。它通过散列函数计算关键码地址,相同地址的码归入同一桶,每个桶用单链表存储元素,链表头结点保存在哈希表中。这种方法能有效处理冲突,提高查找效率。

2026-03-15 21:20:36 1895

原创 线程同步与互斥——生产者、消费者模型

本文介绍了生产者-消费者(CP)模型的核心概念及应用。该模型通过超市类比,阐述了三个优势:缓存提升效率、支持忙闲不均、实现生产消费解耦。在多线程环境下,生产者与消费者通过共享内存通信,需处理三种关系:生产者间互斥、消费者间互斥、生产消费间的同步互斥(321原则)。文章特别强调BlockingQueue的实现,通过队列上限和空状态控制,确保线程安全通信。该模型有效解决了并发环境下的资源竞争和协调问题,实现了高效安全的数据交换。

2026-03-13 10:12:31 2355

原创 C++——哈希表

本文介绍了哈希表的基本原理与实现方法。哈希表通过哈希函数建立键值与存储位置的映射关系,相比红黑树具有更高的查找效率。重点分析了两种哈希映射方法:直接定址法(适合数据集中情况)和除留余数法(适合数据分散情况)。为解决哈希冲突,提出开放定址法(包括线性探测和二次探测)和负载因子控制策略。文章详细阐述了哈希表的模拟实现过程,包括状态管理、插入扩容机制和删除操作等。最后指出开放地址法在数据集中冲突时效率会明显下降的局限性。

2025-05-19 22:36:07 2231

原创 调试器——gdb的使用

本文介绍了Linux下使用gdb调试程序的基本方法。首先说明debug和release模式的区别,指出Linux默认生成release模式程序,调试需加-g选项。详细讲解了gdb常用命令:list查看代码(支持行号和函数名);r运行程序;b设置断点(支持行号、函数名和文件名);n/s进行逐过程/语句调试;p/display查看变量值;until跳转到指定行;finish执行完当前函数;c继续执行到下一断点;以及断点的查看、删除、禁用和启用操作。文章通过具体示例展示了各命令的使用场景,为Linux程序调试提供

2025-04-14 22:45:20 1742

原创 Linux——make和Makefile

本文介绍了Makefile的基本使用和工作原理。Makefile通过定义依赖关系和依赖方法实现自动化构建,其中依赖关系指明目标文件与源文件的关联,依赖方法则描述具体编译命令。make命令会根据文件修改时间自动判断是否需要重新编译,通过比较源文件和目标文件的时间戳来优化编译效率。文章还讲解了.PHONY伪目标的用法、$@/$^等特殊变量,以及如何控制命令回显。此外,简要提及了git版本控制的基本概念。这些内容为软件开发中的自动化构建和版本管理提供了实用指导。

2025-04-07 19:55:36 2083

原创 Linux编译——gcc和g++

GCC/G++编译过程详解:从预处理到链接的完整流程 摘要: 本文详细介绍了gcc/g++编译C/C++代码的完整过程,包括四个关键阶段:预处理(去注释、宏替换、头文件展开)、编译(语法检查生成汇编)、汇编(生成机器码)和链接(生成可执行文件)。重点讲解了-E、-S、-c等选项的使用方法,以及条件编译、头文件位置等实用技巧。通过分析不同阶段生成的临时文件(.i、.s、.o),帮助开发者深入理解编译过程。文章还对比了gcc和g++的关系,并提供了实际编译命令示例,为C/C++开发者提供了完整的编译工具指南。

2025-03-31 21:27:11 2162

原创 C++算法——离散化

适用于数据范围很大,但是数据个数较少的题目。

2025-03-24 21:15:54 2029

原创 C++算法——倍增思想

本文介绍了快速幂和快速乘的倍增思想及其实现。针对大数运算中的溢出问题,详细讲解了取模运算规则:在加法和乘法中可任意位置取模;减法需用"模+模"技巧保证结果为正;除法需通过逆元处理。给出了快速幂的模板代码,利用二进制分解将时间复杂度优化为对数级。同时补充了负数取模运算的特性,并指出快速乘可类似实现。这些方法有效解决了大数运算中的存储和效率问题。

2025-03-17 21:21:54 2024

原创 Linux——vim

Vim是Linux下强大的多模式文本编辑器,支持高效代码编辑。摘要涵盖核心操作:1)三种主要模式切换;2)基础导航命令(gg/G/$/^等);3)文本操作(yy/dd/p/u等复制粘贴撤销);4)字符替换(r/~/x)和多文件编辑(vs多窗口)。重点包括行定位、单词移动、批量操作和替换模式(R),以及窗口切换(Ctrl+w+w)。这些命令组合能显著提升文本编辑效率,适合开发者快速处理代码文件。

2025-03-10 21:05:53 2046

原创 C++算法——差分

差分与前缀和的核心思想相同,是预处理,可以在暴力枚举的过程中,快速给出查询的结果,从而优化时间复杂度。是经典的用空间替换时间的做法。补充:使得最短跳跃距离尽可能长,遇到类似这样的问题时,要往二分、贪心、动态规划这些算法上考虑。

2025-03-03 20:25:49 2326

原创 Linux——yum安装软件

Linux安装软件有三种方案:一、源代码安装,并进行编译,得到可执行程序二、rpm安装。有很多rpm安装包,rpm包之间还存在依赖关系三、yum安装。最便捷的安装方式,无需关心等,会直接安装适配当前系统的软件。

2025-02-24 20:26:15 1901

原创 Linux——权限

Linux系统用户分为root超级用户和普通用户两类,root用户拥有最高权限。用户可通过su/su-指令切换身份,其中root切换普通用户无需密码。权限管理通过身份认证(用户/组/其他)和文件属性(r/w/x)实现,chmod指令可修改文件权限,支持字符和八进制两种表示方式。值得注意的是,Linux不依赖文件后缀区分类型,但某些应用程序(如gcc)仍需使用后缀识别文件。root用户不受常规权限限制,普通用户使用sudo指令需预先加入系统白名单。

2025-02-17 19:26:03 2007

原创 C++——字符数组

【代码】C++——字符数组。

2025-02-10 11:25:38 1972

原创 Linux——指令基础(二)

本文介绍了Linux系统常用指令及其用法。包括:1)时间相关指令date(显示/转换时间戳)、cal(日历);2)文件查找指令find/which/whereis;3)文本处理工具grep(字符串匹配);4)压缩解压命令zip/unzip/tar;5)实用工具bc(计算器)、uname(系统信息);6)热键功能如Tab补全、Ctrl+C终止等;7)系统管理指令shutdown、用户切换su;8)解释Shell作为命令行解释器的工作原理。文章通过具体语法和选项演示了各指令的典型应用场景,帮助读者掌握Linux

2025-02-03 20:52:01 1834

原创 C++——使用字符串比较数字大小的常见问题

字符串比较数字大小时存在字典序问题。当比较"101"和"99"时,虽然数值上101>99,但字符串比较会逐字符对比,导致"101"<"99"。正确做法是:先比较字符串长度,长度大的数值更大;若长度相同,再进行字符串比较。示例代码展示了string和char数组的字符串比较结果,验证了这一现象。

2025-01-28 19:31:00 2083

原创 Linux——指令基础(一)

本文介绍了Linux系统中三个常用命令的使用方法。man命令用于查看帮助文档,支持按章节(-num)、关键字(-k)和显示所有章节(-a)等选项查询。echo命令用于打印字符串。cp命令用于复制文件或目录,常用选项包括强制覆盖(-f)、交互确认(-i)和递归复制目录(-r)。文章特别提醒,在root用户下某些选项可能不生效,建议使用普通用户测试。通过具体示例展示了如何查看命令帮助、使用echo输出以及用cp复制文件和目录。这些基础命令是Linux系统管理的重要工具。

2025-01-28 19:30:52 2172

原创 Linux入门——初识OS和指令

OS是一款做软硬件的软件。一款好的操作系统,衡量指标:稳定、速度快、安全。

2025-01-27 20:13:11 1977

原创 C++11——可变参数模板

摘要:本文探讨了C++11中可变参数模板的应用。介绍了模板参数包的基本用法,包括自动类型推导、sizeof...计算参数个数,以及两种参数包解析方法:递归解析和逗号展开式。重点分析了emplace_back函数的高效性,通过参数包直接构造对象,相比push_back减少了临时对象构造。文章还演示了模拟实现emplace_back的过程,指出其对深拷贝对象的效率提升有限,但对浅拷贝对象效果更显著。

2025-01-06 13:58:30 1709

原创 C++11——新的类功能

C++11新增了两个默认成员函数:移动构造函数和移动赋值运算符重载。这两个函数的默认生成条件严格:只有在没有实现析构函数、拷贝构造和拷贝赋值重载时才会自动生成。默认生成的移动操作对内置类型执行浅拷贝,对自定义类型则根据其是否实现移动操作决定调用方式。此外,C++11还允许类内成员变量初始化,并扩展了default和delete关键字的功能:default可强制生成默认函数,delete可禁止生成。这些改进使资源管理更灵活,同时确保移动语义的正确实现。

2024-12-30 21:22:38 1908

原创 C++11——右值引用和移动语义

本文深入探讨了C++中左值和右值的概念及其应用。左值是可取地址的表达式,右值则是临时不可取地址的表达式。文章详细介绍了左值引用和右值引用的区别,重点阐述了移动语义如何通过移动构造和移动赋值来优化资源管理。通过string类的实现示例,展示了右值引用如何减少深拷贝开销。此外,还讨论了纯右值与将亡值的区别,以及std::move和完美转发的使用场景。文章最后指出,完美转发能保持参数原始属性,是高效传递参数的关键技术。这些特性共同构成了现代C++高效资源管理的基础。

2024-12-23 19:49:30 1945

原创 C++11——STL的变化

摘要:C++11新增了array、forward_list等容器。array是对C语言静态数组的封装,提供严格的边界检查,但实际应用中vector更方便。forward_list是单向链表,节省空间但仅适合头插头删操作。此外还新增了哈希表等高效容器。各容器增加了cbegin/cend等成员函数,但这些改进实际意义不大,属于锦上添花的优化。array和forward_list等新容器为特定场景提供了更多选择,但并非所有新增功能都具有实用价值。

2024-12-16 21:44:36 1884

原创 C++11——声明

摘要:C++11引入了多种简化类型声明的新特性。auto关键字能自动推断变量类型,常用于范围for循环和复杂类型声明。decltype可推导表达式类型并用于模板参数或变量定义。此外,C++11新增nullptr替代NULL,解决了NULL被定义为0导致的二义性问题,使空指针表示更清晰安全。这些特性显著提升了代码的可读性和类型安全性。

2024-12-09 21:40:41 1920

原创 C++11——统一的 { } 初始化

C++11标准引入了多项重要改进,主要包括统一的列表初始化和initializer_list机制。新标准扩展了花括号{}的初始化范围,支持所有内置类型和自定义类型的列表初始化,同时允许省略赋值符号。initializer_list类使得容器支持更灵活的初始化方式,如vector<int> v = {1,2,3}。这些改进简化了语法,增强了类型安全性,使C++11成为功能更强大的新语言版本,显著提升了开发效率和代码可读性。

2024-12-02 23:20:57 1957

原创 C++——红黑树

红黑树,同样是一种二叉搜索树,但在每个结点上增加一个存储位,来表示,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,即最长路径的节点个数不超过最短路径的2倍,因而是的。AVL树是,每个节点的左右子树高度差不超过1。很接近完全二叉树,高度差差别不大,缺少的节点基本在最后两三层而红黑树则是最长路径的节点个数不超过最短路径的2倍。所以红黑树的效率相比AVL树是更慢的,那为什么红黑树的使用却比AVL树更为普遍呢?

2024-11-25 21:48:54 1991

原创 C++——srand、rand和time函数

rand函数可以生成随机数,随机数的范围是0~RAND_MAX(32767)

2024-11-18 00:11:29 2459

原创 C++——AVL树

解决搜索二叉树的缺陷。

2024-11-11 21:41:25 892

原创 C++——map和set

本文系统介绍了C++中的关联式容器,重点分析了set和map的实现原理与使用方式。主要内容包括:1) 关联式容器与序列式容器的区别,前者存储键值对并具有高效检索特性;2) set的实现基于搜索树,支持增删查操作,具有自动排序和去重功能;3) multiset允许键值冗余,失去去重特性;4) map采用pair存储键值对,支持[]运算符实现快速查找和修改;5) multimap不支持[]运算符,允许重复键值。文章通过代码示例详细演示了各容器的插入、查找、删除等操作,并对比了set/multiset和map/m

2024-11-09 20:39:20 1108

原创 C++——二叉搜索树

二叉搜索树又称,它或是,又或是具有的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树可以观察到,对这棵树进行的话,可以得到一串升序的数据如果左子树放大的数据,右子树放小的数据,那么中序遍历就是降序了。

2024-11-02 17:37:17 3666

原创 C++——多态

一、重载要求两个函数在同一个作用域中,函数名相同、参数不同(类型、个数、顺序)时,构成重载。二、重写(覆盖)要求两个函数分别在父类和子类的作用域中,必须都是虚函数,并且要求1.返回值 2.函数名 3.参数类型都要相同,协变例外。三、隐藏(重定义)同样要求两个函数分别在父类和子类的作用域中,但只要求二者的函数名相同,就构成隐藏。两个父类与子类里的同名函数,不构成重写,那就是隐藏。关于纯虚函数一、纯虚函数,或者说抽象类,在某种程度上,间接强制了子类去重写虚函数。

2024-10-26 22:14:22 3355

原创 C++——继承

上述代码中,Person就是父类,也称作基类。Student是子类,也称作派生类。一、基类private成员在派生类中无论以什么方式继承都是不可见的。这里的不可见是指基类的私有成员还是被继承到了派生类对象中,但是语法上限制派生类对象不管在子类里面还是子类外面都不能去访问它。所以父类的一些成员,如果不想要给子类使用,就可以设置为私有,但实际上父类成员也很少定义为私有,因为这样就不符合复用的规则了。二、基类的protected成员被继承下来后,在子类里面可以访问,在子类外面不可以访问。

2024-10-19 23:25:56 2690

原创 C++——再谈模板

虽然它是一个常量,但我们可以。

2024-10-12 16:51:04 2356

原创 C++——反向迭代器

list没有访问到第一个值,而且访问了哨兵位,是随机值。但实际上,这只是另外一种实现方式,它拥有自己的优势。复用已经实现的迭代器实现反向迭代器。乍看库中的实现,vector会越界。为避免上述情况,在其中访问元素时,使用正向迭代器适配出反向迭代器。也可以修改,但要重载运算符。,而且在意义上是不建议重载的。此时出现了问题,编译不通过。

2024-10-11 19:19:35 1054

原创 C++——优先级队列和仿函数

优先级队列不是传统的队列,它不是先进先出,它是让优先级高的先出。实际上它就是堆。注意:优先级队列不需要单独包含头文件,它放在中,使用时包含queue的头文件即可,#include

2024-10-08 14:45:27 1840 1

原创 C++——模拟实现stack和queue

实际上,deque并不常用下标的随机访问,还是vector更强头、尾的插入删除方面,deque还不错,略优于vector和list并且相对于list它的CPU高速缓存更好它头、尾的插入、删除效率> [] > 中间位置的插入、删除。

2024-10-07 14:04:39 800

原创 C++——stack和queue

栈和队列的定义和之前的容器。

2024-10-07 14:04:01 753

原创 C++——模拟实现list

将迭代器封装为类来实现其功能。

2024-10-06 09:15:37 1155

空空如也

空空如也

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

TA关注的人

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