自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Redis命令 (generic即通用命令)

文章摘要:本文介绍了Redis中对Key操作的通用命令(Generic Key Commands),这些命令与Value的数据类型无关。主要讲解了KEYS(按模式匹配键)、EXISTS(判断键是否存在)、DEL(删除键)、EXPIRE(设置过期时间)、TTL(查看剩余生存时间)和TYPE(查看键值类型)等常用命令的语法、作用、时间复杂度和返回值。文章特别强调了批量操作的网络效率优势,并提供了各命令的具体使用示例和注意事项,帮助用户更好地理解和使用Redis的键管理功能。

2026-07-22 18:23:12 247

原创 Redis 全面介绍

Redis是一款高性能的内存键值数据库,支持多种数据结构(字符串、哈希、列表等),具备持久化、高可用和分布式特性。它广泛应用于缓存、会话存储、排行榜、分布式锁等场景。Redis采用C/S架构,基于RESP协议通信,支持主从复制、哨兵和集群模式。学习Redis可通过官方文档、Redis University和实战练习,掌握其核心命令和数据结构。Redis以极简设计实现强大功能,是开发者必备的工具之一。

2026-07-21 18:37:47 1050

原创 shared_ptr与waek_ptr内部原理小讲解

本文探讨了shared_ptr和weak_ptr的内部机制及内存管理问题。shared_ptr包含两个指针(16字节):一个指向对象,一个指向控制块。控制块由首个shared_ptr创建,记录引用计数(strong_count和weak_count)。weak_ptr不创建控制块,仅观察引用状态。文章通过循环引用示例说明:当两个shared_ptr相互持有(如双向链表节点)时,即使外部指针释放,对象因引用计数不为零而无法销毁,导致内存泄漏——这正是引入weak_ptr打破循环引用的关键原因。控制块的生命周期

2026-07-14 22:40:15 243

原创 C++之模板元编程(前置知识 constexpr)

本文详细介绍了C++中const和constexpr关键字的用法及其演进。首先区分了顶层const(修饰变量本身)和底层const(修饰指向内容),然后重点讲解了constexpr在C++11中的特性:修饰变量、函数、构造函数等,要求编译时可计算。随后阐述了C++14对constexpr函数的放宽(允许局部变量、控制流等),C++17引入if constexpr和constexpr lambda,以及C++20的革命性改进(支持动态内存、STL容器、虚函数等)。文章通过丰富示例展示了constexpr如何从

2026-05-21 19:29:33 377

原创 C++11之std::tuple原理解析

摘要:std::tuple是C++11引入的异构容器,通过递归模板继承和空基类优化实现高效存储。其核心原理包括:1)递归模板继承存储不同类型元素;2)编译期确定类型布局;3)空元素不占内存。使用方式包括创建(make_tuple)、访问(get<N>)、修改和解包(结构化绑定/tie)。通过简化实现示例展示了tuple的递归继承结构和get<N>的编译期索引机制,体现了模板元编程的精妙设计。建议手动实现以深入理解其编译期计算特性。

2026-05-19 22:49:41 58

原创 C++11并发支持库(condition_variable | future全家桶)

一、std::condition_variablecondition_variable是我们C++封装后的互斥量condition_variable需要配合互斥锁系列进行使用,主要提供wait和notify系统接口。wait需要传递⼀个unique_lock类型的互斥锁,wait会阻塞当前线程直到被notify。在进入阻塞的⼀瞬间,会解开互斥锁,方便其他线程获取锁,访问条件变量。当被notify唤醒时,他会 同时获取到锁,再继续往下运行。

2026-05-16 20:38:59 381

原创 无锁编程-----atomic

核心说明:C++11 引入 std::atomic(头文件 <atomic>),目的是解决「多线程读写普通变量导致的数据混乱」,它能让变量的读写、修改操作变成“不可分割”的原子操作,无需手动加锁,就能保证多线程安全。也就是我们常说的无锁编程比如我们之前多线程用一个变量进行++的操作,从而导致数据不一致问题,我们会用锁来操作,但是我们学会atomic后,就可以不用锁来进行一些之前需要锁的操作从而用atomic代替#include <atomic> // atomic头文件,必须包含。

2026-05-14 18:56:02 501

原创 C++11语法之并发支持库(线程管理 | 同步与互斥部分中的std::mutex)

time_mutex跟mutex完全类似,只是额外提供try_lock_for和try_lock_untile的接口,这两个接口跟try_lock类似,只是他不会马上返回,而是直接进入阻塞,直到时间条件到了或者解锁了就会唤醒试图获取锁资源。lock_guard的功能简单纯粹,仅仅支持RAII的方式管理锁对象。,尝试对多个锁对象进行同时尝试锁定,如果全部锁对象都锁定了,返 回-1,如果某⼀个锁对象尝试锁定失败,把已经锁定成功的锁对象解锁,并则返回这个对象的下标 (第⼀个参数对象,下标从1开始算)。

2026-05-13 14:11:38 433

原创 C/C++的类型转换

本文系统介绍了C/C++中的类型转换机制。主要内容包括:1. C语言类型转换分为隐式(自动)和显式(强制)两种,前者由编译器自动完成,后者需程序员手动指定;2. C++在兼容C的基础上,增加了类类型转换支持,通过转换构造函数和operator Type()实现自定义类型与内置类型的互转;3. C++引入四种显式类型转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)以提高类型安全性;4. 详细分析了dynamic_cast依赖的RTTI机制及

2026-05-10 17:31:14 516

原创 论close()与signal(SIGPIPE,SIG_IGN)对服务器的重要性

也就是当我们客户端断开,但是我们服务端不小心给与该客户端建立的文件描述符通信时,我们OS会给服务端一个SIGPIPE信号,让其终止该进程。而我们用了该函数相当关于忽略了OS的信号,从而进程不会被终止,要知道我们一个服务器是希望可以长久运行的,不能轻易断开。在我们的四次挥手中,如果我们的客户端断开连接,但是在服务器处于CLOSE_WIAT状态,由于没有close,所以我们服务器会一直处于CLOSE_WAIT状态,从而导致资源一直在浪费,相当于内存泄漏。默认行为:直接杀死进程!

2026-04-29 21:48:18 164

原创 C++中论在类中成员变量定义顺序的重要性

今天,我在运行代码的时候,突然报出了一个错误,那就是,也就是段错误(核心转储)。相信大家大多碰见过这个错误。段错误(SIGSEGV)是程序试图访问非法内存地址时,操作系统强制终止程序并生成的崩溃报告。空指针 / 野指针访问:解引用了一个nullptr,或者访问了已经释放的内存。数组越界:访问了超出数组 / 缓冲区范围的内存。栈溢出:函数调用过深,或在栈上分配了过大的局部变量。多线程内存冲突:多个线程同时修改同一块未加锁保护的数据。

2026-04-28 21:24:51 75

原创 关于使用cpp的getline函数有时候遇到的常见错误(编程,竞赛都可能遇到)

C++中getline()函数使用指南 摘要:本文介绍了C++中getline()函数的基本用法及其与cin混用时常见的问题。getline()用于读取整行文本(包括空格),默认以换行符为分隔符,会自动清除缓冲区中的换行符。当getline()与cin混合使用时,cin留下的换行符会导致getline()立即读取空字符串。解决方案包括:1)使用cin.ignore()清除缓冲区;2)统一使用getline()读取所有输入,再通过stoi()转换数值类型。特别注意的是,连续使用getline()不会出现缓冲区

2026-04-25 17:13:43 39

原创 C++11之正则表达式使用指南--[正则表达式介绍]|[regex的常用函数等介绍]

():)[]?{n}{n,}{n,m}C++ 从C++11开始通过标准库<regex>提供正则表达式支持,涵盖匹配、搜索、替换和分组捕获等功能。我们可以平常工作用来匹配对应字符等等,其实竞赛感觉也可以用,因为我记得之前pta的题经常有这种非常恶心的匹配,替换的题目。

2026-03-29 16:17:42 467

原创 深入理解传输层协议之UDP[报文格式介绍 | 特点 | 缓冲区问题 | 应用场景]

按对UDP的数据进行管理的话,UDP有其发送缓冲区和接收缓冲区,因为要对UDP的数据进行上下层交付以及数据是否超载的管理,但是也可以说 "UDP没有真正意义上的发送缓冲区" (这里指的是由于UDP的特性:无连接、不可靠的协议,它。UDP 不会对应用层传入的数据做拆分、排序、重传处理,应用层给多少数据,UDP 就直接封装成报文发送,因此数据的分片、顺序控制、丢包重传,都需要应用层自行实现。,包含 8 字节的 UDP 首部 + 后面的数据部分,单位为字节,长度固定 16 比特。1. 实时音视频传输。

2026-03-24 23:28:29 369

原创 应用层的HTTP协议

什么是url?url指的是我们平常访问的网址,如下图注意:像我们这种www.qq.com之类的,是一个域名地址,通过域名服务器的DNS的转换才可以找到真正的服务器的ip地址(我们平常可能没买域名,就是直接http://127.0.0.1:8080这种ip+端口号+你后面带层次的文件路径就可以访问你服务器通过网络实现的程序),这里大多网址不会像图片一样会带端口号,因为用的是协议名默认的端口号,比如:tip:这种域名地址转ip地址,不止只有一个ip地址,不然万一比如抖音的一台服务器坏了,那么不就不能访问了。

2026-03-22 17:41:47 350

原创 应用层的自定义协议与序列化(粘包问题)

在我们的应用层中需要进行序列化与反序列化主要是Udp的特点是面向数据报,而Tcp的特点是面向字节流的。这就导致我们Udp每次发送都是将一个报文的内容完整的发送,但是Tcp不是,在用Tcp协议的服务端的发送缓冲区中,只要有数据了,就会发送。所以我们通信双方需要规定一个可以基于Tcp的字节流接收与发送的协议。于是就有了下面的话题序列化与反序列化Jsoncpp是一个纯cpp开源的的JSON库,专注实现JSON字符串 ↔ C++数据结构 的双向转换(序列化/反序列化),是C++处理JSON的主流选择。

2026-03-19 13:26:09 368

原创 网络基础---基建

在这个图中我们主机A发送消息,由于A、B、C、D、E五个主机都在局域网内,那么都会收到主机A的消息,只不过发现B、C、D发现不是发给自己的消息而丢弃掉了以太网中,任何时刻,只允许一台机器向网络中发送数据如果有多台同时发送,会发生数据干扰,我们称之为数据碰撞所有发送数据的主机要进行碰撞检测和碰撞避免没有交换机的情况下,一个以太网就是⼀个碰撞域局域网通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定。

2026-03-09 21:11:23 408

原创 用windows的Qt Creator里cout打印中文竟然会出现乱码,Liunx却不会,这是为啥?

所以由于我们QT用的源代码默认是UTF-8的格式,而我的控制台默认是GBK的格式,那么相当于我们编码最后是变成了UTF-8格式,但是控制台拿着GBK的表去解析,所以导致了乱码。今天在用Qt的时候,用cout打印中文,发现打印出来的是个乱码,问了ai才发现是编码方式不对,QT用的源代码默认是UTF-8的格式,而我的控制台默认是GBK的格式。我们的英文字母是用Ascii码来表示的,也就是一个字符对应一个整数,所以我们这里的GDK和UTF-8编码也是用一个大表格,一个字符对应一个整数。那么我们qt怎么解决?

2026-02-02 15:33:00 268

原创 linux之线程

本文系统介绍了操作系统中的线程、进程与同步机制。首先阐述了线程作为CPU调度基本单位的概念,对比了Linux和Windows的线程实现差异。随后详细讲解了资源划分机制(4KB页框)和多级页表原理。重点分析了线程与进程的优缺点,包括创建代价、切换开销和健壮性差异。在同步机制方面,深入探讨了互斥锁的原理与实现(硬件级中断屏蔽、软件级原子操作),以及条件变量的使用场景和生产者-消费者模型。最后介绍了POSIX信号量及其在环形队列中的应用,强调信号量P操作应置于加锁前的设计原则。

2026-01-16 10:23:56 633

原创 进程间通信

我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”比如:管道通信的5种特性:1.匿名管道只能父子进程进行通信(一般是父子,因为如果子进程间通信会很麻烦,不如命名管道以及共享内存舒服)2.管道通信是面向字节流的3.管道文件自带同步机制写慢,读快----如果写端没有内容,那么读端就会阻塞,等待写端写入写快,读慢----如果管道满了的时候,写端就会进入阻塞状态,等待读端读取完毕写关,读继续----read就会返回0,表示文件结尾。

2025-11-19 18:40:17 861

原创 c++之多态篇

本文系统讲解了面向对象编程中的多态机制,重点分析了C++实现多态的关键技术。首先阐述了多态的概念,即通过统一接口调用不同对象实现不同行为。然后详细说明了构成多态的三大条件:继承体系、基类指针/引用调用和虚函数重写。文章深入探讨了虚函数机制,包括虚函数声明、重写规则及其两个特例(协变和析构函数重写),并介绍了override和final关键字的作用。此外,还解析了抽象类和纯虚函数的接口继承特性。最后从底层原理层面,通过虚函数表指针和虚函数表解释了多态的实现机制,区分了静态绑定和动态绑定的差异。全文通过丰富代码

2025-11-08 17:20:40 844

原创 C++之继承---“继承遗产、创建别的产业公司”

本文系统介绍了面向对象编程中的继承机制。主要内容包括:1. 继承的基本概念,通过派生类复用基类代码,并详细说明了三种继承方式及其访问权限影响;2. 基类和派生类对象间的赋值转换规则,包括"切片"现象;3. 继承中的作用域问题,特别是同名成员的隐藏规则;4. 派生类构造/析构函数的调用顺序及注意事项;5. 友元和静态成员在继承中的特性;6. 重点分析了单继承、多继承和菱形继承问题,提出通过虚继承解决二义性;7. 最后比较了继承(is-a)和组合(has-a)的关系,建议优先使用组合降低耦合

2025-10-12 14:16:37 763

原创 c++模板知识

C++模板分为函数模板和类模板,它们类似于模具,能根据不同类型生成特定版本的函数或类。函数模板通过隐式或显式实例化自动推导类型,遵循优先匹配非模板函数的原则。类模板实例化时需要指定具体类型,支持全特化和偏特化。模板分离编译时可能出现链接错误,解决方法包括将定义放在头文件或进行显式实例化。模板特化(如函数模板特化和类模板全/偏特化)可用于特殊类型的定制处理。非类型模板参数允许使用常量值作为模板参数。

2025-10-10 18:47:54 906

原创 类与对象c++(充分认识类及其默认成员函数)

本文系统介绍了C++类的核心概念与特性,主要内容包括: 类的基础知识:定义方式(声明与实现分离更优)、访问限定符(public/private/protected)、作用域、实例化过程及对象模型(仅存储成员变量); 关键成员函数:构造函数(初始化对象)、析构函数(资源清理)、拷贝构造(深/浅拷贝问题)、赋值运算符重载(需处理自赋值); 特殊机制:this指针(隐式传递对象地址)、初始化列表(必须用于const/引用成员)、static成员(类共享)、友元(突破封装); 其他特性:explicit关键字(禁止

2025-10-03 15:34:06 638

原创 进程的概念

本文系统介绍了计算机进程相关知识,主要包括:1. 冯诺依曼体系结构及计算机硬件组成;2. 操作系统的核心功能和管理方式;3. 进程概念、状态及控制块(PCB);4. 进程创建(fork)、终止和等待(waitpid)机制;5. 进程地址空间和写时复制技术;6. 进程程序替换原理及函数接口;7. 简易shell的实现原理。文章通过代码示例和图示详细说明了进程管理的核心概念,包括父子进程关系、状态转换、地址空间映射等关键知识点,为理解操作系统进程管理提供了基础框架。

2025-09-24 15:34:12 976

原创 环境变量的相关介绍

例如:export MY_VAR="Hello World"(此时子进程可以继承到MY_VAR这个父进程定义的环境变量)

2025-09-24 15:16:12 924

原创 Linux文件权限理解

摘要: 文件权限通过角色(拥有者、所属组、其他用户)和属性(读r、写w、执行x)控制访问。权限由ll命令显示的10字符标识:首字符区分文件类型(如-普通文件,d目录),后9字符分三组对应角色权限。操作权限使用chmod(符号模式如u+x或数字模式如755),修改角色用chown/chgrp。umask决定新建文件/目录的默认权限(如022屏蔽组和其他用户的写权限)。粘滞位(如/tmp的t权限)限制目录内文件仅所有者、目录所有者或root可删除,确保共享目录安全。权限管理保障了系统安全与协作效率。

2025-08-25 20:29:51 1211

原创 Linux下的一些基本指令

​绝对路径 (Absolute Path)​​​定义:​​ 从文件系统的根目录 (Root Directory)​​ 开始,一路指向目标文件或目录的完整路径。它描述了文件或目录在文件系统层次结构中的绝对位置。​特点:​​​以根目录符号开头:​​​Linux/macOS/Unix-like 系统:​​ 以(斜杠) 开头。。​唯一性:​​ 在同一个文件系统中,一个文件或目录的绝对路径是唯一的。无论你当前在哪个目录下工作,相同的绝对路径都指向同一个位置。​清晰明确:​。

2025-08-19 22:40:25 703

原创 C++类与对象的前置小知识

一、缺省参数一、缺省参数该函数的参数已经全都赋予了初值同理,半缺省就是说在函数定义时,里面的参数不会都给赋初值,比如下面这个函数,这次变量a并没有给缺省值,而且要注意的是半缺省的参数必须从右往左给默认值,不能间隔给出,比如不能void txt_Season(int a=0,int b),因为这样编译器在函数调用的时候会出错,从编译器的角度来看:参数绑定是线性的(按从左到右的顺序去匹配)

2025-07-19 21:28:33 552

原创 LCA---倍增法(也许后续会出tarjan法)

首先我们需要fa[N][20],depth[N],p[N]数组,fa数组是用来倍增的,也就是存储该结点的祖先(包括它的父亲和爷爷),depth数组是存储当前结点的深度,我们把根节点的depth定为1,p数组用来模拟队列。比如这张图我要找9和10的祖先,那么先对齐深度,9结点变成5结点,那么发现这两个的父节点不相同,那么此时同步跳跃就发力了,他会将10结点和5结点同步跳跃,也就是每次执行他两深度不变,直到找到最近祖先2,那么就停止。

2025-03-22 10:13:01 355

空空如也

空空如也

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

TA关注的人

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