QT记事本
记事本应用程序提供了基本的文本编辑功能,支持文件的新建、打开、保存和另存为操作,同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。
1. 项目整体结构
main.cpp
:程序的入口点,负责初始化 Qt 应用程序并创建Notepad
窗口实例,最后进入应用程序的事件循环。mainwindow.h
:定义了Notepad
类,继承自QMainWindow
,包含了窗口的成员变量和成员函数的声明。mainwindow.cpp
:实现了Notepad
类的成员函数,完成了记事本的各种功能。
2. 主要功能模块
2.1 窗口初始化
- 在
Notepad
类的构造函数中,创建了一个QTextEdit
控件作为中央部件,用于文本编辑。 - 调用
createActions()
和createMenus()
函数创建菜单栏和菜单项对应的动作。 - 设置窗口标题、大小和初始修改状态。
2.2 菜单栏和动作
- 文件菜单 (
文件(&F)
)- 新建 (&N) (
Ctrl+N
):调用newFile()
函数,在保存当前修改后清空文本编辑区,重置当前文件名和修改状态。 - 打开 (&O)… (
Ctrl+O
):调用openFile()
函数,在保存当前修改后弹出文件选择对话框,选择文件并加载到文本编辑区。 - 保存 (&S) (
Ctrl+S
):调用saveFile()
函数,如果当前文件名为空,则调用saveAsFile()
函数进行另存为操作;否则直接保存当前文件。 - 另存为 (&A)… (
Ctrl+Shift+S
):调用saveAsFile()
函数,弹出文件保存对话框,选择保存路径和文件名并保存文件。 - 退出 (&X):调用
QWidget::close()
函数关闭窗口。
- 新建 (&N) (
- 帮助菜单 (
帮助(&H)
)- 关于 (&A)…:调用
about()
函数,弹出关于对话框,显示应用程序的版本信息和开发环境。
- 关于 (&A)…:调用
2.3 文件操作
- 保存文件 (
save(const QString &fileName)
):使用QSaveFile
打开文件,以 UTF - 8 编码将文本编辑区的内容写入文件。如果保存成功,更新当前文件名和修改状态。 - 加载文件 (
loadFile(const QString &fileName)
):使用QFile
打开文件,自动检测文件编码并读取内容到文本编辑区。如果打开失败,弹出错误对话框。
2.4 修改提示
maybeSave()
:在新建文件、打开文件或关闭窗口时,检查文本编辑区的内容是否被修改。如果已修改,弹出警告对话框询问用户是否保存更改,根据用户的选择进行相应操作。
2.5 关闭窗口处理
closeEvent(QCloseEvent \*event)
:在窗口关闭时,调用maybeSave()
函数询问用户是否保存更改。如果保存成功或用户选择不保存,则接受关闭事件;否则忽略关闭事件。
main.c
// main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc ,char *argv[])
{QApplication app(argc, argv);app.setWindowIcon(QIcon(":/icons/notepad.png"));Notepad notepad;notepad.show();return app.exec();
}
mianwidow.c
// notepad.cpp
#include "mainwindow.h"
#include <QTextStream>
#include <QSaveFile> // 添加缺失的头文件
#include <QStringConverter> // 添加缺失的头文件#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endifNotepad::Notepad(QWidget *parent): QMainWindow(parent),textEdit(new QTextEdit),fileMenu(nullptr),newAct(nullptr),openAct(nullptr),saveAct(nullptr),saveAsAct(nullptr),exitAct(nullptr),helpMenu(nullptr),aboutAct(nullptr)
{textEdit = new QTextEdit;setCentralWidget(textEdit);createActions();createMenus();setWindowTitle(QStringLiteral("Qt记事本[*]"));resize(800, 600);setWindowModified(false);
}void Notepad::createActions()
{newAct = new QAction(QStringLiteral("新建(&N)"), this);newAct->setShortcut(QKeySequence::New);connect(newAct, &QAction::triggered, this, &Notepad::newFile);openAct = new QAction(QStringLiteral("打开(&O)..."), this);openAct->setShortcut(QKeySequence::Open);connect(openAct, &QAction::triggered, this, &Notepad::openFile);saveAct = new QAction(QStringLiteral("保存(&S)"), this);saveAct->setShortcut(QKeySequence::Save);connect(saveAct, &QAction::triggered, this, &Notepad::saveFile);saveAsAct = new QAction(QStringLiteral("另存为(&A)..."), this);saveAsAct->setShortcut(QKeySequence::SaveAs);connect(saveAsAct, &QAction::triggered, this, &Notepad::saveAsFile);exitAct = new QAction(QStringLiteral("退出(&X)"), this);connect(exitAct, &QAction::triggered, this, &QWidget::close);aboutAct = new QAction(QStringLiteral("关于(&A)..."), this);connect(aboutAct, &QAction::triggered, this, &Notepad::about);
}void Notepad::createMenus()
{fileMenu = menuBar()->addMenu(QStringLiteral("文件(&F)"));fileMenu->addAction(newAct);fileMenu->addAction(openAct);fileMenu->addAction(saveAct);fileMenu->addAction(saveAsAct);fileMenu->addSeparator();fileMenu->addAction(exitAct);helpMenu = menuBar()->addMenu(QStringLiteral("帮助(&H)"));helpMenu->addAction(aboutAct);
}void Notepad::newFile()
{if (maybeSave()) {textEdit->clear();currentFile.clear();setWindowModified(false);}
}void Notepad::openFile()
{if (maybeSave()) {QString fileName = QFileDialog::getOpenFileName(this);if (!fileName.isEmpty()) {loadFile(fileName);setWindowModified(false);}}
}bool Notepad::saveFile()
{return currentFile.isEmpty() ? saveAsFile() : save(currentFile);
}bool Notepad::saveAsFile() // 修正返回类型为bool
{QString fileName = QFileDialog::getSaveFileName(this,QStringLiteral("另存为"), currentFile);return fileName.isEmpty() ? false : save(fileName);
}
void Notepad::about()
{QMessageBox::about(this, QStringLiteral("关于 Qt记事本"),QStringLiteral("<h2>Qt记事本 2.0</h2>""<p>基于Qt 6.5开发</p>""<p>支持UTF-8编码文件读写</p>"));
}bool Notepad::maybeSave()
{if (!textEdit->document()->isModified())return true;QMessageBox::StandardButton ret = QMessageBox::warning(this,QStringLiteral("文档修改"),QStringLiteral("文档内容已修改,是否保存更改?"),QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);if (ret == QMessageBox::Save)return saveFile();else if (ret == QMessageBox::Cancel)return false;return true;
}bool Notepad::save(const QString &fileName)
{QSaveFile file(fileName);if (file.open(QFile::WriteOnly | QFile::Text)) {QTextStream out(&file);out.setEncoding(QStringConverter::Utf8);out << textEdit->toPlainText();if (file.commit()) {currentFile = fileName;setWindowModified(false);return true;}}QMessageBox::critical(this, QStringLiteral("保存失败"),QStringLiteral("无法保存文件:\n%1\n%2").arg(fileName, file.errorString()));return false;
}void Notepad::loadFile(const QString &fileName)
{QFile file(fileName);if (file.open(QFile::ReadOnly | QFile::Text)) {QTextStream in(&file);in.setAutoDetectUnicode(true);textEdit->setText(in.readAll());currentFile = fileName;} else {QMessageBox::critical(this, QStringLiteral("打开失败"),QStringLiteral("无法打开文件:\n%1\n%2").arg(fileName, file.errorString()));}
}void Notepad::closeEvent(QCloseEvent *event)
{maybeSave() ? event->accept() : event->ignore();
}Notepad::~Notepad() {}
一、核心功能实现分析
-
文件操作框架
-
采用
QSaveFile
实现原子写入(先写临时文件再替换原文件),有效防止写入中断导致文件损坏;
-
loadFile()
使用
QTextStream
自动检测编码,但建议增加手动编码选择功能(参考Notepad++的多编码支持);
-
缺少最近文件列表功能,可参考Notepad++的Session机制
实现历史文件恢复。
-
-
菜单系统架构
- 采用经典MVC模式,通过
QAction
实现命令与UI解耦; - 快捷键绑定符合平台规范,但缺少自定义快捷键功能(Notepad++支持快捷键自定义)。
- 采用经典MVC模式,通过
-
编码处理
- 显式设置UTF-8编码(
QStringConverter::Utf8
),但未处理BOM标记; - 建议参考Notepad++的编码识别机制,添加自动检测编码功能。
- 显式设置UTF-8编码(
二、潜在问题及改进建议
-
大文件处理
-
当前实现直接读取整个文件到内存,存在内存耗尽风险。建议:
复制
// 分块读取(示例) while(!in.atEnd()) {QString chunk = in.read(4096);textEdit->insertPlainText(chunk); }
-
可参考Notepad++的1MB缓存限制机制
-
-
安全漏洞预防
-
未实现文件变更监控,建议添加
QFileSystemWatcher
检测外部修改; -
需注意Notepad++曾出现的编码转换漏洞
,建议对转换缓冲区进行边界检查。
-
-
用户体验优化
-
增加多文档支持(参考Notepad++的Tab系统)
-
实现撤销/重做栈:
复制
connect(textEdit->document(), &QTextDocument::undoAvailable, undoAct, &QAction::setEnabled);
-
三、关键代码段优化
-
编码处理增强
复制
// 改进后的保存函数 bool Notepad::save(const QString &fileName) {QSaveFile file(fileName);if (file.open(QFile::WriteOnly | QFile::Text)) {QTextStream out(&file);// 添加BOM支持out.setGenerateByteOrderMark(true); out.setEncoding(QStringConverter::Utf8);// 分块写入const QString text = textEdit->toPlainText();for(int i=0; i<text.size(); i+=4096) {out << text.mid(i, 4096);}return file.commit();}//...错误处理 }
-
会话管理实现
// 参考Notepad++的Session结构[4](@ref) struct Session {QStringList recentFiles;QMap<QString, QByteArray> fileStates; // 文件路径+光标位置等 };
四、架构扩展建议
-
插件系统设计
- 创建
PluginInterface
抽象基类 - 实现类似Notepad++的插件加载机制
- 创建
-
语法高亮支持
// 参考Scintilla库集成[2](@ref) class SyntaxHighlighter : public QSyntaxHighlighter {// 实现词法分析规则 };
mianwindow.h
// notepad.h
#ifndef NOTEPAD_H
#define NOTEPAD_H#include <QMainWindow>
#include <QTextEdit>
#include <QFileDialog>
#include <QMessageBox>
#include <QCloseEvent>
#include <QTextStream>
#include <QMenuBar> // 添加缺失的头文件
#include <QMenu> // 添加缺失的头文件
#include <QAction> // 添加缺失的头文件class Notepad : public QMainWindow
{Q_OBJECTpublic:explicit Notepad(QWidget *parent = nullptr);~Notepad();protected:void closeEvent(QCloseEvent *event) override;private slots:void newFile();void openFile();bool saveFile(); // 修正返回类型为boolbool saveAsFile(); // 修正返回类型为boolvoid about();private:void createActions();void createMenus();bool maybeSave();bool save(const QString &fileName);void loadFile(const QString &fileName);QTextEdit *textEdit;QString currentFile;QMenu *fileMenu;QAction *newAct;QAction *openAct;QAction *saveAct;QAction *saveAsAct;QAction *exitAct;QMenu *helpMenu;QAction *aboutAct;
};#endif // NOTEPAD_H
一、代码结构分析
-
继承关系
cpp
复制
class Notepad : public QMainWindow
- 符合Qt主窗口程序标准结构
- 支持菜单栏、工具栏等标准组件
-
成员变量设计
cpp
复制
QTextEdit *textEdit; // 核心编辑组件 QString currentFile; // 当前文件路径 QMenu *fileMenu, *helpMenu; // 主菜单项 QAction *newAct, *openAct... // 功能动作
- 采用Qt对象树内存管理机制
- 指针初始化为
nullptr
(构造函数初始化列表可见)
二、接口设计评估
-
信号槽系统
cpp
复制
private slots:void newFile();bool saveFile(); // 注意:Qt槽函数通常返回void
-
存在设计矛盾:
saveFile()
返回bool但作为槽函数
建议修改
:
cpp
复制
private:bool performSave(); // 非槽函数 private slots:void saveFile(); // 调用performSave()
-
-
事件处理
cpp
复制
protected:void closeEvent(QCloseEvent *event) override;
- 正确覆盖基类虚函数
- 配合
maybeSave()
实现关闭确认
三、代码健壮性分析
-
头文件包含
cpp
复制
#include <QMenuBar> // 冗余包含
-
QMainWindow已包含QMenuBar
优化建议
:
cpp
复制
// 前置声明替代部分包含 class QMenu; class QAction;
-
-
防御性编程
cpp
复制
void createActions(); // 未处理可能的创建失败
建议增强
:
cpp
复制
bool createActions(); // 返回创建状态
四、扩展性改进建议
-
支持多编码
cpp
复制
// 添加编码相关成员 QTextCodec *currentCodec = QTextCodec::codecForName("UTF-8");
-
会话管理
cpp
复制
// 添加最近文件列表 QStringList recentFiles; static const int MAX_RECENT_FILES = 5;
五、代码规范优化
-
命名一致性
cpp
复制
void about(); // 与"关于Qt"的常规命名不一致
- 建议改为
aboutQtNotepad()
- 建议改为
-
const正确性
cpp
复制
bool save(const QString &fileName);
-
可添加const修饰:
cpp
复制
bool isModified() const;
-
相关文章:
QT记事本
记事本应用程序提供了基本的文本编辑功能,支持文件的新建、打开、保存和另存为操作,同时具备修改提示和关闭窗口时的保存确认功能。使用 UTF - 8 编码确保了对多语言文本的支持。 1. 项目整体结构 main.cpp:程序的入口点,负责初…...
【leetcode hot 100 84】柱状图中最大的矩形
解法一:单调栈 class Solution {public int largestRectangleArea(int[] heights) {int len heights.length;int area 0;// 先做一些特殊判断if(len0){return 0;}if(len1){return heights[0];}// 进入栈后发现后面更短,可以得到当前这个能勾勒的面积 …...
Spring----ioc
1.Spring 是什么? 通过前⾯的学习, 我们知道了Spring是⼀个开源框架, 他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区, 这也是Spring能够⻓久不衰的原因. 但是这个概念相对来说, 还是⽐较抽象. 我们⽤⼀句更具体的话来概括Spring, 那就…...
C++——重载
目录 一、函数重载 基本概念 函数重载的条件 编程示例 代码讲解 函数重载的注意事项 二、运算符重载 什么是运算符重载? 运算符重载的实质是什么? 运算符重载函数的写法 运算符重载的基本语法 可重载的运算符列表 基本原则 编程示例 代码解…...
答疑解惑:EMC VMAX3 MMCS控制台不定期重启原因分析
今天有个朋友咨询他们有一台EMC的VMAX100k设备,其中MMCS2的管理控制台定期重启,但始终无法找到重启原因,稍微花了点时间,帮客户看了下。先说结论,MMCS2确实不定期发生重启,每次reboot都是一样的message信息…...
单例模式(Singleton Pattern)
单例模式(Singleton Pattern) 任务管理器可以作为一个全局的任务配置管理类,使用单例模式保证全局只有一个实例。这样你可以避免在应用程序中创建多个任务管理对象,保持配置参数的统一。 示例: class TaskManager { …...
树莓派超全系列文档--(8)RaspberryOS实用程序
RaspberryOS实用程序 实用程序kmsprintvclogvcgencmdvcosversionget_throttledmeasure_tempmeasure_clock [clock]measure_volts [block]otp_dumpget_config [configuration item|int|str]get_mem typecodec_enabled [type]mem_oommem_reloc_statsread_ring_osc 文章来源&#…...
Rust 与 FFmpeg 实现视频水印添加:技术解析与应用实践
引言 在短视频、直播、影视制作等领域,视频水印是一种常见的工具,用于保护版权、提升品牌辨识度或满足合规性要求。然而,开发者在实现水印添加时往往面临以下挑战: 手动处理效率低:使用图像编辑软件(如 P…...
绿联NAS安装内网穿透实现无公网IP也能用手机平板远程访问经验分享
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好,今天给大家带来一个超级炫酷的技能——如何在绿联NAS上快速安装cpolar内网穿透工具。想象一下,即使没有公网IP,你也能随时随地远程访问自己…...
如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载? 在 React 项目里,有时候组件功能多、体积大,要是一次性把所有组件都加载进来,网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...
虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战
目录 系列文章 1. 引言 2 技术栈Request 2.1请求头headers 2.2查找定位信息 2.3处理网页html结构化数据 2.4每页url规律 2.5逐条查找所需信息 2.6完整代码 3 数据存储至mysql 3.1新建数据库 3.2编写数据库写入py文件 3.2.1构建1个执行sql语句的函数 3.2.2构造一个…...
模型 阿米巴模式
系列文章分享模型,了解更多👉 模型_思维模型目录。小团队独立经营,企业活力无限。 1 阿米巴模式的应用 1.1 日航重生(航空业成功案例) 应用领域 航空运输业破产重组与组织激活 案例名称 日本航空(JAL&…...
针对stm32F103C8t6芯片调节USB串口的经验
1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操…...
【Linux网络】——Socket网络编程
前言 在当今数字化的时代,网络通信已经成为计算机领域不可或缺的一部分。无论是日常的网页浏览、社交媒体交互,还是大规模的企业级数据传输,都离不开高效可靠的网络通信。而在Linux操作系统中,Socket网络编程是实现各种网络应用的…...
基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
为了简化使用Coil加载网络图片和GIF的过程,我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法,以及可能的其他便捷方法,如加载圆形图片、设置占位图等。下面是一个示例: 首先&#x…...
Flink watermark的时间字段有空值,建表的时候,如何处理
在 Flink 中处理时间字段存在空值时,需通过 表定义阶段的特殊处理 和 Watermark 生成策略调整 来避免因空值导致的窗口计算异常或任务失败。以下是具体解决方案及实现方法: 1. 空值处理核心策略 1.1 查询时,过滤空值数据(推荐&am…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
【DevOps】DevOps and CI/CD Pipelines
DevOps 是一种将开发与运维实践相结合的模式,旨在缩短软件开发周期并交付高质量软件。 DevOps 是什么? 开发团队与运维团队之间的协作 • 持续集成与持续交付(CI/CD) • 流程自动化 • 基础设施即代码(IaC)…...
ROS--IMU数据包
IMU惯性测量单元 一:IMU二:ROS中三:IMU数据包三:总结 提示:以下是本篇文章正文内容,下面案例可供参考 一:IMU IMU(Inertial Measurement Unit,惯性测量单元)…...
【机器学习】手撕封装PCA——将高维数据映射到低维数据的过程
PCA将高维数据映射到低维数据的过程 一、摘要二、PCA的降维思路三、PCA代码实现降维过程3.1 PCA类的实现与封装3.2 PCA类的使用示例 四、PCA的恢复过程 一、摘要 本文详细介绍了主成分分析法(PCA)在高维数据降维中的应用。首先,阐述了PCA的基…...
LangChain开发(七)自定义输出格式(JSON/XML/YAML)
文章目录 JSON结构输出未使用PydanticPydantic流式处理 XML结构输出xml输出指定字段 YAML输出源码地址参考资料 JSON结构输出 虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型&…...
RustDesk部署到linux(自建服务器)
简介 RustDesk是一款开源的远程桌面软件,由中国开发者开发,使用Rust编程语言构建。它支持跨平台运行,可以在Windows、macOS、Linux、iOS、Android和Web等多个平台上使用。RustDesk的主要功能包括远程桌面访问、文件传输、文本聊天等&…...
分布式锁,redisson,redis
目录 什么是分布式锁分布式锁解决什么问题分布式锁的特点使用分布式锁的场景怎么使用分布式锁1. 添加依赖2. 配置 Redisson 客户端3. 使用 Redisson 实现分布式锁 什么是分布式锁 分布式锁是一种锁机制,用于在分布式环境下,解决多个线程并发访问同一共享…...
linux常用指令(9)
加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述:more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…...
深入解析 JVM 内存区域及核心概念
深入解析 JVM 内存区域及核心概念 Java 虚拟机(JVM)内部划分了多个内存区域,每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容: 程序计数器:记录当前线程正在执行的字节码指令及其“行号”信息&a…...
字节跳动春招研发部笔试题解
字节跳动春招研发部笔试题 1.万万没想到之聪明的编辑 我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发…...
java对象模型
java对象自身的存储模型JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。 a类。当我们在Java代码中,使用new创建一个对象的时候,JVM会在栈中给对象赋值,会在堆中创建一个instanceOopDesc对…...
深入理解指针(3)(C语言版)
文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…...
Linux内核 内存管理 物理内存初始化流程
1.ARM64页表初始化流程图 start_kernel()│▼ setup_arch() // 架构相关初始化│▼ early_fixmap_init() // 初始化Fixmap(临时映射设备树等)│▼ arm64_memblock_init() // 从设备树解析内存布局│▼ arm…...
Day23:和为s的数字
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。 示例 1: 输入:price [3, 9, 12, 15], target 18 输出:[3,15] 或者 [15,3]示例 2&#x…...
Transformer 通关秘籍2:利用 BERT 将文本 token 化
前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…...
电脑干货:万能驱动--EasyDrv8
目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具,一般又称为it天空万能驱动,万能驱动vip版,简称…...
18502 字符串哈希匹配字符串
18502 字符串哈希匹配字符串 ⭐️难度:中等 🌟考点:字符串hash 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int…...
openmmlab介绍 一下
OpenMMLab 是由商汤科技(SenseTime)发起并维护的开源深度学习项目,专注于计算机视觉领域。它提供了一系列模块化、可扩展的工具库,旨在帮助研究者和开发者高效地实现、复现和部署前沿的视觉算法。OpenMMLab 的设计强调模块化、…...
基于javaweb的SpringBoot线上网络文件管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式详解 一、概述 工厂模式(Factory Pattern) 是一种 创建型设计模式,用于 封装对象的创建逻辑,避免在代码中直接实例化对象,从而提高代码的 可维护性、扩展性和解耦性。 二、工厂模式分类 工厂模式包括 简单工…...
【雅思播客09】Turn Left here.
Hello everyone! And welcome to my channel! Im Reevs. Good morning! 大家好,欢迎来到懒人英语晨读栏目,我是Reevs,早上好呀。 I have a great lesson for you today. 今天我有一堂非常棒的课。 We have an elementary lesson, which is …...
初阶7 vector
本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问,和数…...
归并排序总结
归并排序是分治法的典型应用,把两个或k个有序的子序列合并为一个。2路归并,2合一。k路归并,k合一。内部排序通常采用2路归并排序,先将数组分成两半,分别排序,然后合并。合并的过程需要将两个有序的子数组合…...
ollama迁移已下载的单个模型到服务器
ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的…...
基于SSM+Vue物流信息管理系统(附源码)
预览页面 获取方式 https://gitee.com/XiaoLin_Java/communion/blob/master/README.en.md...
docker创建registry镜像仓库2.8版本
目录 shell脚本内容 运行效果 问题与解决 涉及镜像包registry:2.8(x86版本) shell脚本内容 [roottest1 docker]# cat registry.sh #!/bin/bash read -p "请输入用户:" user read -p "请输入密码:" passpathpwd passdir"$…...
Ubuntu下用QEMU模拟运行OpenBMC
1、前言 在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。 2、环境信息 VMware Workstation 15 Pro…...
Unity Shader编程】之复杂光照
在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途: 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...
从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…...
STM32 MODBUS-RTU主从站库移植
代码地址 STM32MODBUSRTU: stm32上的modbus工程 从站 FreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能,包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能,支持Modbus RTU和Modbus TCP协…...
计算机是如何工作的
目录 冯诺依曼体系 CPU基本工作流程: 逻辑门 门电路 算术逻辑单元 ALU(Arithmetic&LogicUnit) 算术单元(Arithmetic Unit) 逻辑单元(Logic Unit) ALU符号 寄存器(Register)和内存(RAM) 控制单元 CU(Control Unit) 指令(Instruc…...