C++ 在 Windows 的开发经验与解决方案
一、开发环境搭建
在 Windows 上进行 C++ 开发,主流的集成开发环境(IDE)有 Visual Studio 和 CLion。Visual Studio 是微软官方推出的强大开发工具,对 Windows 平台有着原生的支持,集成了编译器、调试器、代码编辑器等一系列开发工具。安装时可根据需求选择不同的版本,社区版完全免费,适合个人开发者和小型团队使用。在安装过程中,记得勾选 C++ 相关的工作负载,如 “使用 C++ 的桌面开发”,这样才能完整地获得 C++ 开发所需的组件。
CLion 是 JetBrains 公司推出的跨平台 C++ IDE,虽然它并非专为 Windows 设计,但凭借其强大的代码智能提示、重构功能以及对 CMake 等构建系统的良好支持,也受到不少开发者的喜爱。在 Windows 上使用 CLion,需要搭配 MinGW 或 Cygwin 作为编译器,MinGW 是 Windows 下的 GCC 编译器套件,安装后需将其 bin 目录添加到系统环境变量中,以便 CLion 能够识别和调用。
此外,也可以选择使用命令行工具进行开发,如 Windows 下的命令提示符或 PowerShell,搭配 GCC 或 MSVC 编译器。使用命令行开发虽然没有 IDE 那样直观便捷,但能让开发者更深入地理解编译链接过程,对于调试复杂问题很有帮助。以 MSVC 为例,通过设置环境变量,可在命令行中直接使用 cl.exe 进行编译,如cl.exe -o myprogram myprogram.cpp,这条命令将myprogram.cpp源文件编译并链接成可执行文件myprogram.exe。
二、常见开发场景与实现方法
(一)Windows 桌面应用开发
利用 C++ 和 Windows SDK(软件开发工具包),可以开发出功能强大的桌面应用程序。Windows SDK 提供了丰富的 API,用于创建窗口、处理消息、绘制图形等。例如,创建一个简单的窗口程序,首先需要定义窗口类,指定窗口的样式、回调函数等属性,然后注册窗口类,最后创建并显示窗口。以下是一个简单的示例代码:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT("MyWindow");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = WndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = szAppName;
if (!RegisterClass(&wndclass))
{
MessageBox(NULL, TEXT("This program requires Windows NT!"),
szAppName, MB_ICONERROR);
return 0;
}
hwnd = CreateWindow(szAppName, TEXT("My First Window"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
除了直接使用 Windows SDK,还可以使用一些开源的 C++ GUI 库,如 Qt、MFC(微软基础类库)等。Qt 是一个跨平台的 GUI 库,具有良好的封装性和丰富的类库,使用 Qt 可以在 Windows、Linux、macOS 等多个平台上开发出风格统一的应用程序。MFC 则是微软针对 Windows 平台开发的 C++ 类库,它对 Windows API 进行了封装,使用 MFC 开发 Windows 应用程序可以提高开发效率,但 MFC 的学习曲线相对较陡。
(二)动态链接库(DLL)开发
动态链接库是 Windows 系统中一种重要的代码复用机制。使用 C++ 开发 DLL,可以将一些常用的功能模块封装起来,供多个应用程序共享使用。创建 DLL 时,需要在源文件中使用__declspec(dllexport)关键字导出函数或类,以便其他程序能够调用。例如:
// 在mydll.h头文件中声明导出函数#ifndef MYDLL_H#define MYDLL_H#ifdef MYDLL_EXPORTS#define MYDLL_API __declspec(dllexport)#else#define MYDLL_API __declspec(dllimport)#endifMYDLL_API int Add(int a, int b);#endif// 在mydll.cpp源文件中实现导出函数#include "mydll.h"MYDLL_API int Add(int a, int b){return a + b;}
在使用 DLL 时,可以通过隐式链接或显式链接的方式。隐式链接需要在调用程序的项目中包含 DLL 的头文件,并将 DLL 的导入库(.lib 文件)添加到项目的链接器设置中;显式链接则通过 LoadLibrary 函数加载 DLL,然后使用 GetProcAddress 函数获取导出函数的地址进行调用。
(三)控制台应用程序开发
C++ 在控制台应用程序开发方面也非常出色,常用于开发命令行工具、脚本程序等。在控制台应用中,可以方便地使用标准输入输出库(<iostream>)进行数据的输入和输出操作。例如,实现一个简单的计算器程序:
#include <iostream>int main(){int num1, num2;char op;std::cout << "请输入两个数字和一个运算符(如 2 + 3):";std::cin >> num1 >> op >> num2;switch (op){case '+':std::cout << num1 << " + " << num2 << " = " << num1 + num2 << std::endl;break;case '-':std::cout << num1 << " - " << num2 << " = " << num1 - num2 << std::endl;break;case '*':std::cout << num1 << " * " << num2 << " = " << num1 * num2 << std::endl;break;case '/':if (num2!= 0)std::cout << num1 << " / " << num2 << " = " << static_cast<double>(num1) / num2 << std::endl;elsestd::cout << "除数不能为0" << std::endl;break;default:std::cout << "不支持的运算符" << std::endl;}return 0;}
三、常见问题与解决方案
(一)编译错误
编译过程中可能会遇到各种错误,如语法错误、链接错误等。对于语法错误,编译器会给出详细的错误提示,指出错误所在的行号和原因,开发者只需根据提示修改代码即可。例如,忘记添加分号、变量未声明等错误都属于语法错误。
链接错误通常是由于找不到函数或变量的定义导致的。如果使用了外部库,可能是没有正确设置库的链接路径,或者没有将库文件添加到项目中。在 Visual Studio 中,可以通过项目属性的 “链接器” 选项卡来设置库目录和附加依赖项;在使用 CMake 时,可以通过target_link_libraries命令指定链接的库文件。
(二)内存管理问题
C++ 中需要手动管理内存,这就容易出现内存泄漏、野指针等问题。为了避免这些问题,可以使用智能指针(如std::unique_ptr、std::shared_ptr)来自动管理对象的生命周期。例如,std::unique_ptr用于独占式拥有对象,当它超出作用域时,会自动释放所指向的对象;std::shared_ptr用于共享式拥有对象,通过引用计数来管理对象的生命周期,当引用计数为 0 时,对象会被自动释放。
#include <memory>class MyClass{public:MyClass() { std::cout << "MyClass构造" << std::endl; }~MyClass() { std::cout << "MyClass析构" << std::endl; }};int main(){std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();std::shared_ptr<MyClass> ptr2 = std::make_shared<MyClass>();return 0;}
(三)跨平台兼容性问题
如果希望开发的 C++ 程序能够在多个平台上运行,就需要考虑跨平台兼容性问题。可以使用一些跨平台的库和工具,如 Boost 库、CMake 等。Boost 库提供了许多通用的 C++ 库,如线程库、文件系统库等,这些库在不同平台上有统一的接口;CMake 是一个跨平台的构建工具,它可以根据不同的平台生成相应的构建文件(如 Visual Studio 的项目文件、Makefile 等),方便开发者在不同平台上编译和运行程序。
四、性能优化技巧
在 Windows 开发中,为了提高 C++ 程序的性能,可以采用以下一些优化技巧。首先,合理使用数据结构和算法,例如,对于频繁插入和删除操作的场景,使用链表可能比数组更合适;对于查找操作频繁的场景,使用哈希表或平衡树可以提高查找效率。
其次,减少不必要的内存分配和释放操作。可以使用对象池技术预先分配一定数量的对象,当需要使用时从对象池中获取,使用完毕后再放回对象池,避免频繁的内存申请和释放带来的开销。
此外,充分利用 Windows 系统的多线程特性,将一些耗时的操作放在单独的线程中执行,提高程序的响应速度和执行效率。在使用多线程时,要注意线程同步问题,避免出现数据竞争和死锁等情况,可以使用互斥锁(std::mutex)、条件变量(std::condition_variable)等同步机制来保证线程安全。
以上涵盖了 C++ 在 Windows 开发的多个方面。如果你在实际开发中遇到特定难题,或是想了解某部分的更多细节,欢迎随时和我分享。
相关文章:
C++ 在 Windows 的开发经验与解决方案
一、开发环境搭建 在 Windows 上进行 C 开发,主流的集成开发环境(IDE)有 Visual Studio 和 CLion。Visual Studio 是微软官方推出的强大开发工具,对 Windows 平台有着原生的支持,集成了编译器、调试器、代码编辑器等一…...
1669上什么课
1.题目描述 暑假来了,晶晶报了四门课来充实自己的暑假生活;周一上游泳,周三上编程,周五上阅读,周六上数学;其余时间没课。请从键盘读入今天是星期几,输出晶晶今天应该上什么课。 请注意&#…...
通过MCP让LLM调用系统接口
场景 MCP的出现大大丰富了LLM的功能,对于存量系统,我们希望能让模型调用已有的接口,以最小的成本让AI能够获取系统内部数据。因此我们开发了一个名为http-api-call的MCP Server,来支持模型到内部API的调用 实现方案 使用用标准…...
Java NIO 深度解析:突破传统IO的性能瓶颈
一、Java NIO 核心价值与演进历程 1.1 传统IO的局限性 Java传统的BIO(Blocking I/O)模型在应对高并发场景时存在显著缺陷: 线程资源浪费:每个连接需要独立线程处理上下文切换开销:线程数增加导致CPU调度成本指数级增长吞吐量瓶颈:受限于线程池大小和操作系统限制响应延…...
AI-02a5a5.神经网络-与学习相关的技巧-权重初始值
权重的初始值 在神经网络的学习中,权重的初始值特别重要。实际上,设定什么样的权重初始值,经常关系到神经网络的学习能否成功。 不要将权重初始值设为 0 权值衰减(weight decay):抑制过拟合、提高泛化能…...
sqlalchemy库详细使用
SQLAlchemy 是 Python 中最强大、最受欢迎的 ORM(对象关系映射)库,它允许你使用 Python 对象来操作数据库,而不需要直接编写 SQL 语句。同时,它也提供了对底层 SQL 的完全控制能力,适用于从简单脚本到大型企…...
最短路和拓扑排序知识点
1、在一个有权无向图中,如果顶点b到顶点a的最短路径长度是10,顶点c与顶点b之间存在一条长度为3的边。(c与a的最短路径长度不超过13;c与a的最短路径不小于7) 2、我们用一个有向图来表示航空公司所有航班的航线。最适合…...
【Alist+RaiDrive挂载网盘到本地磁盘】
1.安装准备 安装RaiDrive RaiDrive - 像 USB 驱动器一样安装云存储 安装alist 安装方式请查看官网: AList文档 2.启动Alist(docker) docker官网 Install | Docker EngineDocker Desktop | Docker Docs 运行容器 docker run -d --restartalways -v /home/alist:/opt/alist/…...
达梦数据库 【-6111: 字符串转换出错】问题处理
达梦数据库 【-6111: 字符串转换出错】问题处理 问题背景问题分析问题总结 问题背景 今天在更新数据库某一个值属性的时候,执行更新语句报错提示 -6111: 字符串转换出错,但是自己检查了sql语句,只是一个简单的sql,并没有需要字符…...
Java的多线程笔记
创建一个线程的方法有多种,比如可以继承Thread类或者实现Runnable接口,结论是实现Runnable接口比前者更加优越。 二者代码对比 Java 不支持多继承,如果你继承了 Thread 类,就不能再继承其他类,实现 Runnable 接口后&am…...
学习51单片机01(安装开发环境)
新学期新相貌.......哈哈哈,我终于把贪吃蛇结束了,现在我们来学stc51单片机! 要求:c语言的程度至少要到函数,指针尽量!如果c语言不好的,可以回去看看我的c语言笔记。 1.开发环境的安装&#x…...
互联网协议的多路复用、Linux系统的I/O模式
目录 1. 互联网协议栈-多路复用 1.1. 应用层的多路复用 2.2. 传输层的多路复用 3.3. 网络层的多路复用 2. Linux系统的I/O模式 2.1. I/O 2.2. Socket 2.3. 从网卡到操作系统 2.4. Socket 编程模型 2.5. I/O多路复用 2.6. 阻塞/非阻塞、同步/异步 2.7. Question 1. …...
vue中,created和mounted两个钩子之间调用时差值受什么影响
在 Vue 中,created 和 mounted 是两个生命周期钩子,它们之间的调用时差主要受以下几个因素影响: 🟢 1. 模板复杂度与渲染耗时(最主要因素) mounted 的触发时间是在组件的 DOM 被挂载之后(也就是…...
软件设计师考试《综合知识》计算机编码考点分析——会更新软设所有知识点的考情分析,求个三连
2019-2023年真题深度解析与备考策略 分值占比分析 75分中编码相关分值分布与核心考点 年份编码相关题量分值占总分比例核心考点20232题2分2.67%补码表示范围、IEEE 754偏移量20223题3分4.00%原码/反码比较、浮点数规格化20211题1分1.33%补码表示-1的能力20202题2分2.67%移码…...
剖析提示词工程中的递归提示
递归提示:解码AI交互的本质,构建复杂推理链 递归提示的核心思想,正如示例所示,是将一个复杂任务分解为一系列更小、更易于管理、逻辑上前后关联的子任务。每个子任务由一个独立的提示来驱动,而前一个提示的输出(经过必要的解析和转换)则成为下一个提示的关键输入。这种…...
【SSL证书系列】https双向认证中客户端认证的原理
HTTPS双向认证(也称为双向SSL/TLS认证)是一种增强安全性的机制,其中客户端和服务器都需要验证彼此的数字证书,以确保双方身份的真实性。以下是其核心原理和步骤的详细解析: 一、双向认证的核心目标 双向身份验证&#…...
map格式可以接收返回 fastjson2格式的数据 而不需要显示的转换
Fastjson2 JSONObject 与 Map 的关系 Fastjson2 的 JSONObject 类定义如下: public class JSONObject extends JSON implements Map<String, Object>, Cloneable {// 实现了 Map 接口的所有方法(put、get、keySet 等) }解释ÿ…...
NHANES稀有指标推荐:PWI
文章题目:Association between plain water intake and the risk of osteoporosis among middle-aged and elderly people in the United States: a cross-sectional study DOI:10.3389/fnut.2025.1527771 中文标题:美国中老年人白开水摄入与…...
CN 第二章 应用层-单选题
非并行TCP连接 HTTP非持续连接 假定在同一Web服务器上的某HTML文件引用了3个非常小的对象(例如图片)。忽略传输时延,往返时延为RTT,不考虑连接释放时间,采用非并行TCP连接的HTTP非持续连接方式将该页面完整接收下来需…...
游戏引擎学习第279天:将实体存储移入世界区块
黑板讲解:为什么使用SOA(结构体数组)而不是AOS(数组结构体)来构建实体系统 我们在构建游戏实体系统时,探讨了使用结构体数组(SOA, Struct of Arrays)而不是结构体组成的数组&#x…...
zabbix7.2最新版本 nginx自定义监控(三) 设置触发器
安装zabbix-get服务 在zabbix-server端口安装zabbix-get服务 [rootlocalhost ~]# dnf install -y zabbix-get Last metadata expiration check: 1:55:49 ago on Wed 14 May 2025 09:24:49 AM CST. Dependencies resolved. Package Architectur…...
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段
解密企业级大模型智能体Agentic AI 关键技术:MCP、A2A、Reasoning LLMs- OpenAI AGI 五阶段 然后第三个阶段就是agent,注意这里面的agent和我们说应用程序开发的这个agent是一个不同的概念。AI just can take actions autonomously自动的去执行一些动作。但大家像今天我们看到…...
Flink实时统计任务CPU异常排查与解决方案
一、核心原因分析 资源配置不合理 CPU核数与并行度不匹配:TaskManager的taskmanager.numberOfTaskSlots设置过高,导致单个节点负载过载(如32核节点设置2个slot被多个任务占用,总需求超过物理CPU核数)。内存与CPU分配不均:内存不足引发频繁GC,间接导致CPU利…...
Vue3指令(二)--v-text、v-html数据渲染,计算属性
目录 (一)数据渲染 1.插值表达式渲染数据 1.1实战案例 1.1.1代码: 1.1.2实现截图: 2.使用v-text和v-html来渲染数据 2.1实战案例: 2.1.1代码: 2.1.2实现截图: (二ÿ…...
【深入Spring系列】源码级深入剖析SpringBoot如何实现自动装载
1. SpringBoot自动装载 Spring Boot 实现“自动装载”(Auto Configuration)是其最核心、最强大的功能之一,使得开发者可以快速搭建项目而无需进行复杂的 XML 配置。这一机制的底层实现主要依赖于 Spring Framework 的条件注解机制 和 Spring…...
【AI News | 20250514】每日AI进展
AI Repos 1、ocr-workbench OCR Workbench 是一款使用 AI(Gemini 或 Tesseract)进行文档光学字符识别(OCR)并生成 Markdown 或 HTML 转录的开源 Web 应用。它专为处理需要大量编辑的 OCR 文本而设计,特别是老旧文档。…...
嵌入式设计模式基础--C语言的继承封装与多态
继承,封装和多态是OOP的三大核心特性,它们共同构了面向对象的基础.但嵌入式开发中大量的使用到的却是C语言这种面向过程的语言,那么我们就需要了解如何在C中使用设计模式的思想做功能开发。要了解设计模式,我们就需要先搞清楚 继承…...
【python爬虫】python+selenium实现Google Play Store应用信息爬虫+apk下载
实验要求:利用pythonselenium实现Google Play Store应用信息爬虫apk下载。 其中: 1、热门应用列表包含200个app,需要点击右侧按钮滑动产生下一页数据,所以需要Selenium来控制页面操作。 2、每个应用的爬虫信息包括:ap…...
RPC协议及库介绍
一.RPC介绍 RPC(Remote Procedure Call),远程过程调用协议,客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样,即允许像调用本地服务一样调用远程服务。 RPC框架的…...
【教程】Docker更换存储位置
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 背景说明 更换教程 1. 停止 Docker 服务 2. 创建新的存储目录 3. 编辑 Docker 配置文件 4. 迁移已有数据到新位置 5. 启动 Docker 服务 6…...
vue3实现JSON格式化和JSONPath提取功能
功能简介 1、JSON数据的格式化 2、通过JSONPath语法对格式化后的数据匹配提取 基础环境参考 vue3flasksqlite前后端项目实战 包安装 npm install jsonpath src/views/JsonFormat.vue <template><div class"json-formatter-container"><el-card cla…...
【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)
该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一) 一般情况下,我们远程调用服务,可以用restTemplate来进行http请求的访问。接…...
在 Angular 中, `if...else if...else`
在 Angular 中,模板语法本身并不直接支持 if...else if...else 这样的多条件分支结构。不过,你可以通过使用 *ngIf 指令结合其else模板功能来实现类似的效果。下面是如何模拟if...else if...else逻辑的方法: 示例:实现if...else …...
深入掌握 Python 切片操作:解锁数据处理的高效密码
在 Python 的编程宇宙中,每一个开发者都在不断探索各种强大且实用的工具,以提升代码的效率与灵活性。其中,切片操作作为 Python 数据处理领域的核心技能之一,就像是一把精巧的瑞士军刀,无论是处理文本信息、分析数据列…...
基于 Kubernetes 部署容器平台kubesphere
一 前言: k8s 大家都已经非常熟悉了,网上流传着非常多的搭建部署文档,有kubeadmin的有二进制的,还有基于第三方的部署工具的,反正是各种部署方法都有,k8s部署技术热门可见一斑。但是不管哪种部署都需要了解…...
lua 作为嵌入式设备的配置语言
从lua的脚本中获取数据 lua中栈的索引 3 | -1 2 | -2 1 | -3 可以在lua的解释器中加入自己自定的一些功能,其实没啥必要,就是为了可以练习下lua...
NVMe简介2
共分2部分,这里是第2部分。 NVMe数据结构 NVMe协议中规定每个提交命令的大小为64字节,完成命令大小为16字节,NVMe命令分为Admin和IO两类,NVMe的数据块组织方式有PRP和SGL两种。提交命令的格式如图5所示。 图5 提交命令数据格 N…...
具身智能梳理以及展望
具身智能相关技术与发展历程 具身智能概念 具身智能指具有自身体验、改变物理世界的智能。 过去 5.4 亿年,地球所有生物智能由身体作用于世界的行为塑造。 1950 年,图灵在《Computing Machinery and Intelligence》论文中首次提出具身智能࿰…...
【Redis实战篇】秒杀优化
1. 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单…...
【HTTPS基础概念与原理】TLS握手过程详解
以下是 TLS握手过程的详细拆解,涵盖客户端与服务器之间的关键交互步骤,包括ClientHello、ServerHello、证书验证、密钥交换等核心阶段,并对比TLS 1.2与TLS 1.3的差异: 一、TLS握手的核心目标 协商协议版本:确定双方支…...
libmemcached库api接口讲解三
前言:讲解一下如何删除数据 🗑️ libmemcached 删除键操作教程:memcached_delete() / memcached_delete_by_key() 📘 1. 函数作用 用于从 Memcached 中删除指定的 key,包括: memcached_delete()ÿ…...
注解和 XML 两种方式有什么区别?
注解和 XML 是两种常见的配置方式(尤其在 Java 开发中,如 Spring 框架),它们的主要区别体现在配置方式、代码耦合性、可读性、维护性等方面。以下是两者的对比: 1. 配置方式 注解(Annotation) 在…...
[论文阅读]Formalizing and Benchmarking Prompt Injection Attacks and Defenses
Formalizing and Benchmarking Prompt Injection Attacks and Defenses Formalizing and Benchmarking Prompt Injection Attacks and Defenses | USENIX 33rd USENIX Security Symposium (USENIX Security 24) 提出了一个框架来形式化提示注入攻击,对提示注入攻击…...
分布式2(限流算法、分布式一致性算法、Zookeeper )
目录 限流算法 固定窗口计数器(Fixed Window Counter) 滑动窗口计数器(Sliding Window Counter) 漏桶算法(Leaky Bucket) 令牌桶算法(Token Bucket) 令牌桶与漏桶的对比 分布式…...
阿里端到端多模态语音对话开源模型论文速读:Qwen2.5-Omni
Qwen2.5-Omni 技术报告 1. 介绍 Qwen2.5-Omni 技术报告介绍了一个先进的端到端多模态模型 Qwen2.5-Omni,该模型能够感知包括文本、图像、音频和视频在内的多种模态,并能同时以流式方式生成文本和自然语音响应。该模型解决了统一不同理解模态、管理不同…...
React 第四十节 React Router 中 useBeforeUnload的使用详细解析及案例说明
useBeforeUnload 是 React Router 提供的一个自定义钩子,用于在用户尝试关闭页面、刷新页面或导航到外部网站时触发浏览器原生的确认提示。 它的核心用途是防止用户意外离开页面导致数据丢失(例如未保存的表单内容)。 一、useBeforeUnload 核…...
c++STL——哈希表封装:实现高效unordered_map与unordered_set
文章目录 用哈希表封装unordered_map和unordered_set改进底层框架迭代器实现实现思路迭代器框架迭代器重载operator哈希表中获取迭代器位置 哈希表的默认成员函数修改后的哈希表的代码封装至上层容器 用哈希表封装unordered_map和unordered_set 在前面我们已经学过如何实现哈希…...
通过迁移学习改进深度学习模型
在 ArcGIS Living Atlas of the World (Browse | ArcGIS Living Atlas of the World)中,可以下载能够分类或检测影像中要素的预训练深度学习模型。 深度学习模型在与用于训练模型的原始影像十分相似的影像上运行效果最好。 如果您所拥有的影像…...
SpringAI更新:废弃tools方法、正式支持DeepSeek!
AI 技术发展很快,同样 AI 配套的相关技术发展也很快。这不今天刚打开 Spring AI 的官网就发现它又又又又更新了,而这次更新距离上次更新 M7 版本才不过半个月的时间,那这次 Spring AI 给我们带来了哪些惊喜呢?一起来看。 重点升级…...
输入一个正整数,将其各位数字倒序输出(如输入123,输出321)
之前的解法: 这种方法仅支持三位数。 学了while之后,可以利用循环解决。 这种方法动态构建逆序数,支持任意长度的正整数。...