- 博客(67)
- 收藏
- 关注
原创 python的容器
基础容器是 Python 核心:列表(可变有序)、元组(不可变有序)、字典(键值对映射)、集合(无序去重),覆盖绝大多数常规场景。容器选择依据:是否有序、是否可变、是否需要映射关系、是否需要去重,对应选择合适的容器类型。进阶容器(collections 模块):针对特定场景优化,如 defaultdict 解决键不存在问题、deque 提升两端操作效率、Counter 快速统计元素次数。
2025-12-23 19:18:05
402
原创 python的类
class# 定义一个“学生”类# 类属性:所有学生共享的学校名称school = "第一中学"# 构造方法:初始化学生的姓名、年龄、成绩# 实例属性:每个学生独立拥有# 实例方法:打印学生信息print(f"姓名:{self.name},年龄:{self.age},成绩:{self.score},学校:{self.school}")# 实例方法:提升成绩print(f"{self.name}成绩提升{add_score}分,当前成绩:{self.score}")
2025-12-23 19:12:54
641
原创 python学习
通过sep参数可以修改多个对象之间的分隔符,替代默认的空格,支持字符串、空字符等多种形式# 用逗号作为分隔符,输出:苹果,香蕉,橙子print("苹果", "香蕉", "橙子", sep=",")# 用短横线作为分隔符,输出:2025-12-23# 空分隔符,输出:abc123默认情况下,print 输出后会自动添加换行符\n(即打印后自动换行),通过end参数可以修改结尾符,实现不换行输出或自定义结尾内容。# 不换行输出(结尾用空字符),最终输出:123456# 结尾用分号,输出:Python。
2025-12-23 18:08:32
331
原创 音视频项目框架
结合现有技术栈(STM32、C++11、FFmpeg),判断需求是否可落地按 “分层设计” 原则拆分模块 —— 例如视频监控系统分为 “视频采集层(摄像头 SDK 对接)、传输层(Reactor 网络模型)、解码层(FFmpeg)、应用层(Qt 客户端)”,并定义模块间接口(如视频流采用 RTSP 协议,数据交互用 TLV 格式);嵌入式软件需设计任务调度逻辑(如 FreeRTOS 的任务优先级分配:数据采集任务优先级高于 UI 显示任务),输出《软件架构设计文档》。
2025-11-17 13:43:55
979
原创 STM32常问问题
11.然后KEIL的话,你看过编译的中间文件么,比如那个.map文件你看过么?看那个.map你会关注什么,最底下那几个代码段说一下它各代表什么意思?10.你有自己写过makefile么?15.如果两个任务间要传递一个比较大的数据,队列创建时你会把队列的元素长度给他规定的很大么?16.IIC的话,主机怎么去控制对一个寄存器是读操作还是写操作?12.FreeRTOS的优先级是只与单片机有关么?9.你们使用的板子的主频是多大的。13.任务句柄是用来干吗的?8.spi的主从模式区别。4.Flash是多大的。
2025-11-17 12:07:24
247
原创 MTK外包面经
在 FFmpeg 多媒体处理框架中,AVPacket是用于存储编码后的音视频数据包的核心结构体,是音视频流处理(如读取、编码、解码、封装、传输)的关键数据载体。它主要用于在不同模块(如解复用器、编码器、解码器、复用器)之间传递编码后的原始数据(如 H.264/H.265 视频帧、AAC 音频帧)。一、AVPacket的定义与核心成员AVPacket的定义位于 FFmpeg 的// 存储编码后的音视频数据(原始字节流)int size;// data的大小(字节数)
2025-11-07 17:19:59
554
原创 Makefile
自定义变量就是程序员自己编写代码定义的变量OUT := main #目标文件OBJS := main.o add.o #生成目标文件所需要的依赖COM_OP := -Wall -g #编译选项clean:预定义变量,即由Makefile自身预先定义好的变量,我们可以直接拿来,也可以先重新赋值再用。
2025-11-06 19:48:44
923
原创 音视频ffmpeg
通过这个框架,就能实现 “输入文件→解封装→解码→重新编码→复用→输出文件” 的完整流程。如需播放(而非输出文件),则在解码后将原始帧(YUV/PCM)交给渲染层(如 SDL 显示视频、播放音频)即可。
2025-10-18 17:25:37
387
原创 MySQL常用API
在 C 语言中操作 MySQL 数据库依赖于 MySQL 官方提供的(也称为),这套 API 包含一系列函数,覆盖从 “初始化连接” 到 “释放资源” 的全流程。
2025-10-11 16:09:39
1015
原创 MySQL基础
DDL 是管理数据库结构的 “手术刀”,核心命令围绕 “创建(CREATE)、查询(SHOWDESCRIBE)、修改(ALTER)、删除(DROP)” 展开。实际使用中,创建和修改操作需仔细设计(如字段类型、约束),删除操作需极度谨慎(建议先备份)。结合你之前操作的xia数据库和student表,多动手练习这些命令,能快速掌握 DDL 的使用。根据具体业务需求自定义的完整性规则,不属于上述三类,但用于满足特定场景(如格式验证、业务逻辑约束)。数据完整性是数据库设计的核心原则,通过。
2025-10-10 20:08:32
963
原创 Reactor模型和类图设计
该框架通过面向对象封装(隐藏底层 socket 细节)、回调机制(解耦业务与网络)、C++ 资源管理特性(RAII、智能指针),实现了 “高效事件驱动 + 安全资源管理”,适合构建高性能 TCP 服务(如服务器、网关等)。
2025-10-09 16:50:49
961
原创 服务器架构模型
并发服务器模型的演进,本质是 **“用更高效的资源管理方式支撑更高的并发”**:从 “一连接一资源(进程 / 线程)” 到 “少数资源管理多连接(事件驱动)”。
2025-10-07 19:35:48
1008
原创 IO多路复用(epoll)
红黑树是一种通过 “颜色规则” 实现自平衡的二叉搜索树,它在保证操作复杂度为 O (log n) 的同时,减少了平衡调整的开销(旋转次数少),因此成为工程中处理动态有序数据的首选结构,尤其适合频繁插入、删除的场景(如网络编程中的事件管理、容器类库等)。epoll是 Linux 内核提供的一种高效的 I/O 多路复用机制,专门用于在高并发场景下管理大量文件描述符(File Descriptor,如网络套接字socket),解决了传统selectpoll。
2025-10-04 15:22:07
753
原创 QT音视频
不仅可以播放mp3音频文件,也可以播放视频文件(如 .mp4、.avi 等),但需要与QVideoWidget 配合使用以显示视频画面。
2025-09-26 20:14:11
628
原创 Qt线程的两种使用方式
C/C++程序都是从main函数入手的,Qt程序也不例外,在Qt中每个程序启动后拥有的第一个线程是GUI线程,也称主线程或者main线程,主线程负责几乎所有GUI操作,Qt中所有的组件类只能工作在GUI线程。而对于非GUI的耗时操作,都由QThread及其子类来完成,可以称为工作线程或者子线程。Qt中使用QThread类提供不依赖平台的管理线程的方法,如果要设计多线程程序,一般是从QThread继承定义一个线程类,在自定义线程类里进行任务处理。
2025-09-26 19:28:25
998
原创 QT绘画系统
Qt的绘图系统(Painting System) 基于QPainter,QPainterDevice和QPaintEngine三个类QPaintEngine类应用于QPainter和QPaintDevice之间,通常对开发人员是透明的。除非你需要自定义一个设备,否则你是不需要关心QPaintEngine这个类的。我们可以把QPainter理解成画笔;把QPaintDevice理解成使用画笔的地方,比如纸张、屏幕等;
2025-09-25 22:32:50
344
原创 Qt 网络编程
用于TCP通信的主要接口函数如下:TCP客户端使用QTcpSocket与Tcp服务器建立连接并通信。客户端的QTcpSocket实例首先通过connectToHost函数尝试连接到服务器,需要指定服务器的IP地址和端口。connectToHost函数是异步方式连接到服务器,不会阻塞程序运行,连接后发射connected信号。
2025-09-25 20:54:17
791
原创 QT事件系统
定义事件类型:通过获取自定义事件类型 ID(确保唯一);创建事件子类:继承QEvent,封装事件数据;发送事件:使用或发送;处理事件:在目标对象的event()函数中判断自定义类型并处理。示例:自定义 “数据更新” 事件// 1. 定义事件类型(确保全局唯一)// 2. 自定义事件类(封装数据)public:} // 获取事件数据private:// 事件携带的数据// 3. 处理自定义事件的对象Q_OBJECTprotected:// 转换为自定义事件并处理。
2025-09-23 11:10:54
966
原创 QT的数据类型
Qt 的数据类型设计兼顾了跨平台兼容性、功能丰富性和易用性,核心类型如QStringQListQMap等在日常开发中高频使用。这些类型通常与标准 C++ 类型可相互转换,方便混合使用 Qt 框架和标准库。使用时需注意包含对应的头文件(如。
2025-09-22 16:15:10
781
原创 内联函数(inline)
在类的声明中直接定义的成员函数(函数体在类内部),默认被编译器视为内联函数,无需显式加inline关键字。class A {public:int get_data() { // 类内定义,隐式内联private:int data;如果成员函数的声明在类内,而定义在类外,只有显式加上inline关键字,才会被视为内联函数;否则为普通函数。class A {public:// 类内声明private:int data;// 类外定义,显式加inline才是内联函数。
2025-09-22 09:42:28
953
原创 QT的部件
是 Qt 中快速实现列表功能的 “利器”,适合简单场景(如静态选项列表、文件列表展示)。如果需要更灵活的数据管理(如实时更新、多视图共享数据),则应考虑使用QListView配合模型(如在 Qt 中,是用于展示树形层级结构数据的便捷部件(属于 Item Widgets 家族),特别适合呈现具有父子关系的数据(如文件系统、分类列表、组织架构等)。它自带内置模型,无需手动关联外部模型,使用简单直观,适合快速开发。是快速实现树形结构的理想选择,适合展示层级关系明确的简单数据(如文件列表、分类菜单)。
2025-09-18 20:25:04
786
原创 QT按钮和容器
抽象按钮提供如下常用函数//按钮是否被选中(即是否处于选中状态),只有可选中按钮才能被选中。默认未被选中//设置按钮是否选中//isDown用于获取按钮当前是否处于 "按下状态"(视觉上显示为被按下的样子)。//返回true表示按钮当前显示为按下状态,false则表示未按下(默认状态)。//setDown用于手动设置按钮的 "按下状态"。传入true会强制按钮显示为按下的视觉效果,//传入false则恢复正常未按下的视觉效果。//按钮上显示的图标,//按钮上显示的图标的大小。
2025-09-18 09:35:28
1155
原创 主窗口和布局
是 Qt 开发桌面应用的首选主窗口类,其预设的结构简化了复杂界面的组织。通过合理使用菜单栏、工具栏、状态栏和中央部件,可快速构建功能完整、交互友好的应用程序界面。实际开发中,通常会继承并根据需求扩展其功能。在 Qt 中,布局(Layout)是管理界面控件位置和大小的核心机制,能够自动调整控件的排列方式,使界面在窗口大小改变、分辨率变化或不同平台上保持一致的美观性和可用性。Qt 提供了多种布局类,适用于不同的界面设计需求。Qt 布局系统是界面开发的核心,通过合理组合。
2025-09-16 20:35:48
1065
原创 TextQuery文本查询程序
我们先回顾一下下面这个简单的版本其实这个和之前开始的那个查询单词的版本是有相似之处的, 它就是在之前的那个抽象出来的, 把其中的查询结果QueryResult抽象成了一个类,方便取反和取并集把文件放到容器中也抽象成了一个类TxetQuery提供了一个统一的查询接口Query相当于之前的查询函数,只不过由于要实现与或非,所以实现里多态,创建了一个基类Query_base, 然后继承了一系列的函数"
2025-09-14 16:33:26
1344
原创 QT元对象系统
Qt 是一个跨平台的 C++ 应用程序开发框架,由挪威 Trolltech 公司(后被 Nokia 收购,现为 The Qt Company 所有)开发,旨在简化桌面、移动、嵌入式等多平台应用的开发。它不仅提供了丰富的 GUI 组件,还包含了网络、数据库、多媒体、绘图等一系列功能模块,是开发高效、美观的跨平台应用的重要工具。一、Qt 的核心优势跨平台性一次编写,多平台运行。
2025-09-13 17:08:37
1389
原创 线程池基础实现(C++)
为什么要有线程池?假设没有使用线程池时,一个请求用一个子线程来处理。每来一个请求,都得创建子线程,子线程执行请求,关闭子线程。当请求量(并发)比较大的时候,频繁地创建和关闭子线程,也是有开销的。因此提出线程池,提前开辟好N个子线程,当有任务过来的时候,先放到任务队列中,之后N个子线程从任务队列中获取任务,并执行,这样能大大提高程序的执行效率。其实当任务数大于线程池中子线程的数目的时候,就需要将任务放到缓冲区(队列)里面,所以本质上还是一个生产者消费者模型。
2025-09-13 09:31:00
444
原创 线程的创建.销毁
C++ 线程创建的核心是通过普通函数:适合简单、无状态的线程逻辑。lambda 表达式:适合简短逻辑或需要捕获外部变量的场景。函数对象:适合需要携带状态的复杂逻辑。成员函数:适合面向对象编程中,线程逻辑需访问类成员的场景。优先使用:当场景简单,临界区全程需要锁定时,它更轻量、更高效。使用:当需要灵活性(手动解锁、延迟锁定、配合条件变量等)时,牺牲少量性能换取功能。两者的核心目标都是安全管理锁的生命周期,避免手动操作锁导致的错误,选择时主要依据场景的复杂度和灵活性需求。
2025-09-11 17:01:50
1140
原创 面向对象设计原则
继承是垂直关系,其它的四种是水平关系;从语义划分:继承 is;依赖:use;关联、聚合、组合:has;从耦合强弱:依赖 < 关联 < 聚合 < 组合 < 继承;从代码层面:依赖:主要体现在成员函数上;关联、聚合、组合:主要体现在数据成员;继承:既有数据成员,也有成员函数;定义一个 “创建对象的接口”,但让子类决定具体创建哪个类的对象(如 “造手机”,父类定义造手机的流程,子类决定造苹果手机还是华为手机)。
2025-09-08 21:09:07
967
原创 空间配置器
这段代码中的空闲链表,本质是一种 “数组索引 + 单链表顶层:_free_lists 静态数组:作为 “大小分类目录”,16 个元素对应 16 种对齐后的小内存块大小(8~128 字节);底层:多条单链表:数组的每个元素对应一条单链表,链表节点是FreeObj类型的空闲内存块,通过next指针串联;核心特性按大小分类管理:避免不同大小的空闲块混放,分配时直接定位对应链表,效率高;头插 / 头取:分配和释放均为 O (1) 时间复杂度,适合小内存频繁操作;批量填充:链表空时通过_refill。
2025-09-06 16:06:49
864
原创 cppreference_docs
指示两个元素相等,则这两个元素的相对顺序是不确定的。这意味着即使两个元素在逻辑上是等价的,(value < *it) 等价于 (*it <= value)函数被用于对数组进行排序。当排序时,如果比较函数(merge是要求是排好顺序的, 并且是升序排序。不会保证它们在排序后的数组中的顺序。它的本质是调用上面的两个函数。当相等的时候选择左边部分。当相等的时候选择右边部分。
2025-09-03 22:09:44
520
原创 Lambda 表达式(匿名函数)
配合std::sort// 按“异或1后的值”排序(Lambda 作为比较器)});// 结果:1, 3, 2, 4(奇数在前,偶数在后)return 0;Lambda 表达式是 C++ 中简化代码、提升灵活性的重要工具,其核心优势是 **“就地定义、按需使用”,避免了冗余的函数声明。关键是掌握捕获列表 ** 的使用(决定如何访问外部变量),并根据场景选择合适的参数、返回值和修饰符(如mutable常见记忆口诀:[]抓外部,()传参数,{}写逻辑,auto存对象,mutable改副本。
2025-09-01 19:45:59
693
原创 序列容器(vector,deque,list)
STL 序列式容器(vectordequelistarray)的核心特征是(元素的逻辑顺序与物理存储顺序一致)
2025-08-29 16:41:45
842
原创 C++ 模板(Template)
(Generic Programming)的核心机制,它允许开发者编写独立于具体数据类型的代码,从而实现代码复用、类型安全和灵活性。模板的本质是 “代码生成器”—— 编译器会根据传入的具体类型,自动生成对应类型的代码。C++ 模板(Template)是实现。
2025-08-27 11:11:48
170
原创 移动语义和智能指针
通过右值引用(T&&识别可被移动的对象(右值);通过移动构造函数和移动赋值运算符实现资源的 “转移” 而非 “复制”;配合std::move显式触发左值的移动操作。移动语义显著提升了 C++ 程序处理资源密集型对象的性能,是现代 C++ 编程的核心技术之一。在 C++ 中,智能指针(Smart Pointer)是一种封装了裸指针(raw pointer)的类模板,用于自动管理动态内存(new分配的对象),避免手动手动delete。
2025-08-26 20:37:31
677
原创 多态(polymorphism)
看下面的例子,注意在Base中加了virtual和没有加virtual的区别public://成员函数上面标注了一个virtual那么便是虚函数//virtual//virtualprivate:public://virtualprivate:Derived d;//使用基类指针去指向派生类对象//pbase里面存储的便是派生类对象的地址//Base *指针决定了该指针只可以sizeof(Base)个字节int main()test();return 0。
2025-08-22 20:09:12
1168
原创 继承(Inheritance)
继承中的隐藏是编译器的名字查找规则导致的:当在派生类中查找某个名称时,编译器会先在派生类内部查找,找到后就停止向上查找基类的同名成员。这一机制可能导致意外屏蔽基类成员,因此实际开发中应尽量避免在派生类中定义与基类同名的成员(除非有意隐藏)。多继承的核心是让派生类同时拥有多个基类的功能,但也可能带来菱形继承(需用虚继承解决)和成员名冲突(需显式指定来源)等问题。实际开发中应谨慎使用多继承,优先考虑组合(将多个类作为成员对象)而非继承,以降低代码复杂度。
2025-08-21 17:54:20
1010
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅