SFINAE(Substitution Failure Is Not An Error)
C++ 中的 SFINAE(替换失败并非错误)
SFINAE(Substitution Failure Is Not An Error)是 C++ 模板元编程的核心机制之一,允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理,逐步解析 SFINAE 的实现和应用。
1. SFINAE 的基本概念
当编译器尝试实例化模板时,如果模板参数替换(Substitution)导致错误(如类型不匹配、无效表达式等),该错误不会立即终止编译,而是忽略当前模板候选,继续寻找其他可行的候选。这一机制使得可以基于类型特性选择不同的模板重载或特化。
2. SFINAE 的实现方式
2.1 使用 std::enable_if
std::enable_if
是标准库提供的工具,根据条件启用或禁用模板。
#include <type_traits>// 当 T 是整数类型时启用此模板
template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
void process(T value) {std::cout << "处理整数: " << value << std::endl;
}// 当 T 不是整数类型时启用此模板
template <typename T, typename = std::enable_if_t<!std::is_integral_v<T>>>
void process(T value) {std::cout << "处理非整数: " << value << std::endl;
}int main() {process(10); // 输出 "处理整数: 10"process(3.14); // 输出 "处理非整数: 3.14"return 0;
}
底层原理:
std::enable_if_t<Condition>
在条件为true
时生成void
类型,否则导致替换失败。- 编译器选择第一个替换成功的模板。
2.2 使用 decltype
检测成员函数
通过 decltype
和 std::void_t
检查类型是否具有某个成员。
#include <type_traits>// 检查类型 T 是否具有 serialize 方法
template <typename T, typename = void>
struct has_serialize : std::false_type {};template <typename T>
struct has_serialize<T, std::void_t<decltype(std::declval<T>().serialize())>> : std::true_type {};template <typename T>
constexpr bool has_serialize_v = has_serialize<T>::value;// 根据是否具有 serialize 方法选择实现
template <typename T>
std::enable_if_t<has_serialize_v<T>> serialize(const T& obj) {obj.serialize();
}template <typename T>
std::enable_if_t<!has_serialize_v<T>> serialize(const T& obj) {std::cout << "默认序列化" << std::endl;
}struct MyData {void serialize() { std::cout << "MyData::serialize()" << std::endl; }
};int main() {MyData data;serialize(data); // 输出 "MyData::serialize()"serialize(42); // 输出 "默认序列化"return 0;
}
底层原理:
std::void_t
用于构造依赖类型,如果表达式obj.serialize()
无效,则特化失败,回退到通用模板。has_serialize_v<T>
作为条件控制模板的启用。
3. SFINAE 的典型应用场景
3.1 条件化构造函数
允许类模板根据类型特性提供不同的构造逻辑。
#include <iostream>
#include <type_traits>template <typename T>
class Container {
public:// 仅当 T 可默认构造时启用此构造函数template <typename U = T>Container(std::enable_if_t<std::is_default_constructible_v<U>, int> = 0) {std::cout << "默认构造" << std::endl;}// 通用构造函数Container(const T& value) {std::cout << "通用构造" << std::endl;}
};int main() {Container<int> c1; // 输出 "默认构造"Container<std::string> c2("Hello"); // 输出 "通用构造"return 0;
}
3.2 函数重载决策
根据参数类型选择不同的算法实现。
#include <type_traits>// 处理整数类型
template <typename T>
std::enable_if_t<std::is_integral_v<T>, T> compute(T a, T b) {return a + b;
}// 处理浮点类型
template <typename T>
std::enable_if_t<std::is_floating_point_v<T>, T> compute(T a, T b) {return a * b;
}int main() {std::cout << compute(3, 4) << std::endl; // 7std::cout << compute(2.5, 3.0) << std::endl; // 7.5return 0;
}
4. SFINAE 的底层原理
4.1 两阶段编译
- 模板定义检查:检查模板的语法和非依赖名称。
- 模板实例化:替换模板参数,检查依赖名称和表达式有效性。
4.2 名称修饰与符号生成
每个模板实例生成唯一的符号名,例如:
compute<int>
→_Z7computeIiET_S0_S0_
compute<double>
→_Z7computeIdET_S0_S0_
5. SFINAE 的局限性及替代方案
5.1 局限性
- 代码复杂度高,难以调试。
- 条件较多时易出错。
5.2 C++20 Concepts
C++20 引入 Concepts,提供更清晰的语法约束模板参数。
template <typename T>
requires std::integral<T>
void process(T value) {std::cout << "整数处理: " << value << std::endl;
}template <typename T>
requires std::floating_point<T>
void process(T value) {std::cout << "浮点处理: " << value << std::endl;
}
总结
技术 | 应用场景 | 示例工具 |
---|---|---|
std::enable_if | 条件化启用模板 | 类型特性检查(is_integral ) |
decltype + void_t | 检测成员或表达式有效性 | 自定义类型特性(has_serialize ) |
Concepts (C++20) | 更简洁的模板约束 | requires 子句 |
总结一下,SFINAE的机制允许编译器在模板参数替换失败时,不报错,而是忽略该候选,继续寻找其他可能的重载。这使得基于类型特性的条件编译成为可能,是模板元编程中的重要技术。
多选题
题目 1:SFINAE 与函数重载的优先级
以下代码的输出是什么?
#include <iostream>
#include <type_traits>template <typename T>
typename std::enable_if<std::is_integral<T>::value>::type
process(T val) { std::cout << "Integral: " << val << std::endl; }template <typename T>
typename std::enable_if<!std::is_integral<T>::value>::type
process(T val) { std::cout << "Non-integral: " << val << std::endl; }void process(double val) { std::cout << "Double: " << val << std::endl; }int main() {process(10); // 调用哪个版本?process(3.14); // 调用哪个版本?return 0;
}
A. Integral: 10
和 Double: 3.14
B. Integral: 10
和 Non-integral: 3.14
C. Integral: 10
和 Non-integral: 3.14
,但 process(double)
会导致歧义
D. 编译失败,存在歧义
题目 2:类型特性检测与 SFINAE
以下代码的输出是什么?
#include <iostream>
#include <type_traits>template <typename T, typename = void>
struct HasSerialize : std::false_type {};template <typename T>
struct HasSerialize<T, std::void_t<decltype(std::declval<T>().serialize())>> : std::true_type {};struct DataA { void serialize() {} };
struct DataB {};template <typename T>
std::enable_if_t<HasSerialize<T>::value> save(const T& obj) {std::cout << "Has serialize()" << std::endl;
}template <typename T>
std::enable_if_t<!HasSerialize<T>::value> save(const T& obj) {std::cout << "No serialize()" << std::endl;
}int main() {save(DataA{}); // 调用哪个版本?save(DataB{}); // 调用哪个版本?return 0;
}
A. Has serialize()
和 No serialize()
B. No serialize()
和 No serialize()
C. 编译失败,HasSerialize
定义错误
D. 运行时错误
题目 3:SFINAE 与构造函数条件化
以下代码是否能编译通过?
#include <type_traits>class NonCopyable {
public:NonCopyable() = default;NonCopyable(const NonCopyable&) = delete;
};template <typename T>
class Container {
public:template <typename U = T>Container(std::enable_if_t<std::is_copy_constructible<U>::value, int> = 0) {}
};int main() {Container<int> c1; // 是否合法?Container<NonCopyable> c2; // 是否合法?return 0;
}
A. 编译成功
B. 编译失败,因为 Container<NonCopyable>
无法构造
C. 编译失败,因为 Container<int>
的构造函数无效
D. 编译失败,因为 std::enable_if
条件错误
题目 4:SFINAE 与返回类型推导
以下代码的输出是什么?
#include <iostream>
#include <type_traits>template <typename T>
auto compute(T a, T b) -> typename std::enable_if<std::is_integral<T>::value, T>::type {return a + b;
}template <typename T>
auto compute(T a, T b) -> typename std::enable_if<std::is_floating_point<T>::value, T>::type {return a * b;
}int main() {std::cout << compute(3, 4) << std::endl; // 输出什么?std::cout << compute(2.5, 3.0) << std::endl; // 输出什么?return 0;
}
A. 7
和 7.5
B. 12
和 7.5
C. 编译失败,函数模板冲突
D. 运行时错误
题目 5:SFINAE 与 C++20 Concepts 的对比
以下代码片段是否合法?
#include <concepts>template <typename T>
requires std::integral<T>
void process(T val) { std::cout << "Integral" << std::endl; }template <typename T>
void process(T val) { std::cout << "Generic" << std::endl; }int main() {process(10); // 调用哪个版本?process(3.14); // 调用哪个版本?return 0;
}
A. 合法,输出 Integral
和 Generic
B. 合法,输出 Integral
和 Integral
C. 编译失败,requires
与 SFINAE 冲突
D. 编译失败,函数模板无法重载
答案与解析
题目 1:SFINAE 与函数重载的优先级
答案:A
解析:
process(10)
匹配std::enable_if<std::is_integral<T>>
的模板版本。process(3.14)
优先匹配非模板函数process(double)
,因为非模板函数优先级高于模板函数。- 选项 B 错误,因为非模板函数
process(double)
是更优选择。
题目 2:类型特性检测与 SFINAE
答案:A
解析:
HasSerialize<DataA>
检测到serialize()
方法,特化为true_type
。HasSerialize<DataB>
未检测到serialize()
,保留false_type
。save(DataA{})
调用第一个模板,save(DataB{})
调用第二个模板。
题目 3:SFINAE 与构造函数条件化
答案:B
解析:
Container<int>
的构造函数条件为std::is_copy_constructible<int>
(满足),合法。Container<NonCopyable>
的构造函数条件为std::is_copy_constructible<NonCopyable>
(不满足),导致构造函数不可用,编译失败。
题目 4:SFINAE 与返回类型推导
答案:A
解析:
compute(3, 4)
匹配整数版本,返回3 + 4 = 7
。compute(2.5, 3.0)
匹配浮点版本,返回2.5 * 3.0 = 7.5
。- SFINAE 确保两个模板的返回类型条件互斥,无冲突。
题目 5:SFINAE 与 C++20 Concepts 的对比
答案:A
解析:
- C++20 Concepts 的
requires
子句优先于普通模板。 process(10)
匹配带约束的模板,process(3.14)
匹配无约束的模板。- Concepts 是 SFINAE 的现代替代方案,但二者可共存且无冲突。
总结
这些题目覆盖了 SFINAE 的核心机制,包括类型特性检测、函数重载优先级、构造函数条件化以及 Concepts 的交互。解析需结合模板替换规则、重载决议优先级和 C++20 新特性,确保对静态多态的深入理解。
相关文章:
SFINAE(Substitution Failure Is Not An Error)
C 中的 SFINAE(替换失败并非错误) SFINAE(Substitution Failure Is Not An Error)是 C 模板元编程的核心机制之一,允许在编译时根据类型特性选择不同的模板实现。以下通过代码示例和底层原理,逐步解析 SFI…...
学习记录:DAY17
我的学习日志:前端开发练习 前言 只想畏缩在自己的床上,什么也不想干😰 我觉得有必要调整一下复习方针,不然容易白学。 我确实不太爱复习的人,尽量每天抽出时间来复习昨天的内容,周末总体复习一下一个星期…...
LibrePhotos本地部署打造个人云相册安全存储和分享家庭照片(1)
文章目录 前言1.关于LibrePhotos2.本地部署LibrePhotos3.LibrePhotos简单使用4. 安装内网穿透5.配置LibrePhotos公网地址6. 配置固定公网地址 前言 手机里塞满了珍贵回忆,却担心一不小心就被偷看?别怕,今天我就教你一个绝招——使用LibrePho…...
Android插拔U盘导致黑屏问题排查
问题现象: 车机大屏偶先插拔带音乐的U盘,导致车机系统短暂黑屏的情况。 日志中可以看到vold进程unmount了两次分区,一次是U盘分区,一次是/storage/emulated/0分区: I vold : Start killProcesses: /mnt/media_rw/…...
Android Build Variants(构建变体)详解
Android Build Variants(构建变体)是 Android 开发中用于生成不同版本应用程序的一种机制。它允许开发者根据不同的需求,如不同的应用市场、不同的功能模块、不同的环境配置等,从同一个代码库中生成多个不同的 APK。 组成部分 B…...
看一看 中间件Middleware
中间件(Middleware)是介于操作系统与应用程序之间的一层软件 它为分布式应用程序提供了统一的通信、数据交换、服务调用、消息传递等能力。 它的作用就像“胶水”,连接各个系统组件。 文章目录 消息队列缓存中间件数据库中间件服务注册与发现…...
ai人才需要掌握什么
在人工智能(AI)技术重塑全球产业格局的今天,AI人才的核心竞争力已超越单一技术维度,演变为“技术深度+人文广度+伦理自觉”的三维能力模型。本文将从技术能力体系、跨学科思维、伦理与治理三个层面,解析AI人才的核心能力框架,并针对技术局限性提出系统性应对策略。 一、…...
RISC-V低功耗MCU动态时钟门控技术详解
我来分享一下RISC-V核低功耗MCU的动态时钟门控技术实现: 这款MCU通过硬件级时钟门控电路实现了模块级的功耗管理。当外设(如UART、SPI)处于闲置状态时,系统会自动切断其时钟信号,减少无效翻转功耗。同时支持多电压域协…...
第十天 Shader编程:编写简单表面着色器 Addressable资源管理系统 DOTS(面向数据技术栈)入门
前言 作为Unity初学者,在实现复杂场景时经常会遇到性能瓶颈。本文将带你通过四个关键技术的实战学习,掌握现代Unity开发的核心优化方案: Shader编程 - 编写表面着色器控制物体渲染Addressable系统 - 实现高效资源管理DOTS技术栈 - 解锁百万…...
把dll模块注入到游戏进程的方法_插APC注入
一、概述 APC是异步过程调用,系统创建线程的时候会为线程创建一个APC队列,当线程调用SleepEx,WaitSingleObjectEx等函数时,并把线程状态被设置为可提醒状态时,线程并不会睡眠,而是检查APC队列是否为空,如果不为空,转去执行APC队列中的每一项,因此给目标进程中的线程插…...
【C++】内存管理:内存划分、动态内存管理(new、delete用法)
文章目录 一、C/C中的内存划分二、C语言中动态内存管理方式三、C中动态内存管理方式1、new、delete基本用法(1)、内置类型(2)、自定义类型 2、operator new与operator delete函数3、new和delete的实现原理(1)内置类型(2)自定义类型…...
【k8s】KubeProxy 的三种工作模式——Userspace、iptables 、 IPVS
在 Kubernetes 集群中,KubeProxy 是实现 Service 的网络代理和负载均衡功能的关键组件。它支持三种工作模式:Userspace 模式、iptables 模式和 IPVS 模式。每种模式都有其特点和适用场景,以下是详细介绍: Userspace 模式 工作原…...
密码学的hash函数,哈希碰撞, collision resistance, BTC用到的SHA-256简介
密码学中的哈希函数、哈希碰撞、抗碰撞性(collision resistance)以及比特币中使用的 SHA-256 的简明介绍: 🧩 一、哈希函数(Hash Function) 定义: 哈希函数是一种将任意长度的输入(…...
通过监督微调(SFT)提升AI Agent效果的完整指南
一、SFT技术深度剖析 1.1 核心概念 监督微调(Supervised Fine-Tuning)是在大规模预训练语言模型(如LLaMA、GPT系列)的基础上,使用特定任务标注数据进行二次训练的过程。其本质是通过有监督学习调整模型参数ÿ…...
TCP基础题:音乐播放列表管理系统
需求描述 服务器端 创建一个 TCP 服务器,监听本地的 9999 端口,支持多个客户端连接。维护一个音乐播放列表,每个音乐条目包含歌曲名称、歌手、时长等信息。能够处理客户端的以下请求: 添加音乐到播放列表:接收客户端发…...
碰一碰发视频源码文案功能,支持OEM
在数字化营销与内容传播领域,碰一碰发视频文案功能凭借 NFC 技术的便捷性,实现了视频与文案的快速传递。本文将围绕该功能的开发流程,从需求分析、技术架构设计到核心功能实现,详细解析其开发要点,为开发者提供实践参考…...
如何在 Vue 3 中实现一个自定义的 `v-html` 组件
引言 在 Vue.js 中,v-html 是一个非常有用的指令,用于将 HTML 字符串渲染到元素中。然而,由于它直接插入 HTML 内容,存在潜在的安全风险(如 XSS 攻击)。因此,了解其工作原理并实现一个安全的替…...
差分对的返回电流-信号完整性分析
差分对的返回电流: 单端线的返回电流集中在参考平面,差分对的返回电流是怎样分布的?有一种观点认为,对于差分对这种耦合传输结构,其中一条走线是另一条走线的返回路径。甚至更进一步得出差分对不需要参考平面的结论。是否真的如此?要想了解…...
html单页业务介绍源码
源码介绍 html单页业务介绍源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行 效果预览 源码免费获取 html单页业务介绍源码...
IDEA导入并启动若依项目步骤(SpringBoot+Vue3)
1.下载后端项目 项目地址:https://gitee.com/y_project/RuoYi-Vue 复制命令,将项目克隆到本地 git clone gitgitee.com:y_project/RuoYi-Vue.git使用IDEA打开(会有点慢,耐心等待),打开后如下 2.Mysql导…...
零基础上手Python数据分析 (22)案例实战]之利用 Matplotlib Seaborn 进行电商销售数据可视化分析
写在前面 —— 图表为刃,洞察先行!综合运用 Pandas、Matplotlib 与 Seaborn,点亮数据价值 本篇通过一个完整的案例实战,体验如何将数据分析与数据可视化紧密结合,让冰冷的数据转化为生动、直观、富有洞察力的视觉故事! 案例目标: 本篇博客将延续我们在第 17 篇案例中…...
图像预处理-霍夫变换
一.概念 霍夫变换是图像处理的一种技术,主要用于检测图像中的直线、圆等几何形状。基本思想就是将图像空间(直角坐标系或极坐标系)中的点映射到(霍夫空间)参数空间中,通过在参数空间中寻找累计最大值实现对特定形状的检测。 接下…...
逐步了解蓝牙 LE 配对(物联网网络安全)
配对是蓝牙 LE 中的一个重要概念。让我们来了解一下蓝牙 LE 配对的基础知识,概述 LE 设备如何在可信设备之间安全地共享密钥。 在之前的一篇文章]中,我们讨论了蓝牙 LE 的安全密钥。我们了解到,蓝牙 LE 设备可以创建并共享三个不同的安全密钥:一个用于数据加密,一个用于创…...
嵌入模型(Embedding Models)原理详解:从Word2Vec到BERT的技术演进
一、什么是嵌入模型? 嵌入模型(Embedding Models) 是一种将高维离散数据(如文本、图像)转换为低维连续向量表示的技术。这些向量能够反映数据的语义关系,使得“语义相近的实体在向量空间中距离更近”。例如…...
解析塔能科技:绿色低碳智慧节能一站式破局之匙
在能源问题日益凸显的当下,绿色低碳、高效节能成为全球发展的重要课题。对各类节能方案进行深入剖析后,可以发现塔能科技的绿色低碳智慧节能一站式解决方案极具创新性与实用性,切实为众多行业面临的能源困境提供了有效解决路径。 直面行业痛点…...
el-menu箭头改为右下
问: el-menu箭头改为右下 回答: :deep(.el-menu){.el-sub-menu .el-sub-menu__icon-arrow{transition: transform 0.3stransform: rotateZ(-90deg) !important;}/* 展开状态:箭头向下 */.el-sub-menu.is-opened .el-sub-menu__icon-arrow,…...
[特殊字符][特殊字符] HarmonyOS相关实现原理聊聊![特殊字符][特殊字符]
Hey小伙伴们~ 今天咱们来聊聊HarmonyOS的实现原理吧!🤔💡 虽然直接看源代码是最直接的方式,但是OpenHarmony项目的开源进度有点让人捉急呢… 不过没关系,我们可以通过已经开放的SDK、IDE、开发示例和编译产物来一探究竟…...
RTSP播放器实现回调RGB|YUV给视觉算法,然后二次编码推送到RTMP服务
引言 在本文中,我们将介绍如何基于大牛直播SDK构建一个功能强大的RTSP|RTMP播放器,该播放器利用自定义SDK解码视频、处理RGB帧,并将其推送到RTMP流中进行直播。这个解决方案非常适合需要在实时视频流中集成视觉算法的场景,在处理…...
补题【Darkness+Different Billing+Dice Game】
文章目录 1.Darkness2.Different Billing3.Dice Game 1.Darkness 题目来源:Darkness I 这题不难想,通过作图我们发现 当nm时直接取对角线就好 当n!m时,取m,n的最小值,那么最小值的这个正方形都可以被填为黑色,剩下的…...
卷积神经网络:视觉炼金术士的数学魔法
🎮 “你以为《赛博朋克2077》的夜之城是画出来的?不,是卷积神经网络’卷’出来的!” 🎮 一、卷积:像素世界的连连看大师 想象你拿着一张《蒙娜丽莎》的拼图——卷积核就像你手中的拼图碎片,在画…...
Python:简介,Python解释器安装,第一个Python程序,开发环境(PyCharm安装和配置、Sublime安装和配置)
目录 Python简介 Python解释器的安装(Windows) 下载和安装Python安装包(解释器) 验证Python安装情况 第一个Python程序 单行运行 多行运行 Python开发环境(安装和配置PyCharm工具) 安装PyCharm Py…...
CE第二次作业
实验要求: 1.配置ssh实现A,B主机互相免密登录 2.配置nginx服务,通过多ip区分多网站 一,配置ssh实现A,B主机互相免密登录 步骤 在主机 A 上生成 SSH 密钥对。把主机 A 的公钥复制到主机 B。在主机 B 上重复上述步骤…...
【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)
习题集: 【单选题】在使用Ragas评估RAG应用时,Answer Correctness指标计算中,语义相似度是通过以下哪种方式得到的?( ) A. 大模型直接判断 B. 计算文本向量的余弦相似度 C. 对比文本词汇重合度 D. 统计文本字数差异 【多选题】当Context recall指标得分较低时,可采取的优…...
多头注意力
Multi-Head Attention 论文地址 https://arxiv.org/pdf/1706.03762 多头注意力介绍 多头注意力是Transformer模型的关键创新,通过并行执行多个独立的注意力计算单元,使模型能够同时关注来自不同表示子空间的信息。每个注意力头学习不同的语义特征&#x…...
【leetcode100】目标和
1、题目描述 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - ,然后串联起所有整数,可以构造一个 表达式 : 例如,nums [2, 1] ,可以在 2 之前添加 ,在 1 之前添加 - …...
动态哈希映射深度指南:从基础到高阶实现与优化
哈希表是计算机科学中最高效的数据结构之一,而动态哈希映射通过智能扩容机制,在实时系统中展现出极强的适应性。本文将深入探讨其实现细节,结合主流框架源码解析,并给出可落地的性能优化方案。 一、动态哈希的数学本质 1. 哈希函…...
leetcode 2799. 统计完全子数组的数目 中等
给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件,则称之为 完全子数组 : 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1ÿ…...
使用RabbitMQ实现判题功能
这次主要选用RabbitMQ消息队列来对判题服务和题目服务解耦,题目服务只需要向消息队列发送消息,判题服务从消息队列中取信息去执行判题,然后异步更新数据库即可。 五一宝宝请快点跑~~~~~ 先回顾一下RabbitMQ (1)引入依…...
无过拟合的记忆:分析大语言模型的训练动态
Kushal Tirumala⇤ Aram H. Markosyan⇤ Luke Zettlemoyer Armen Aghajanyan Meta AI 研究 {ktirumala,amarkos,lsz,armenag}fb.com 原文链接:[2210.09262] Physics-Driven Convolutional Autoencoder Approach for CFD Data Compressions 摘要 尽管超大语言模型…...
【Java面试笔记:进阶】16.synchronized底层如何实现?什么是锁的升级、降级?
在 Java 中,synchronized 关键字的底层实现依赖于 对象头(Object Header) 和 监视器锁(Monitor) 机制,并通过 锁的状态升级(Lock Escalation) 来优化同步性能。 1. synchronized 的底层实现 synchronized 的同步机制基于 Monitor 对象,它是同步的基本实现单元。 通过…...
python可视化:北方城市人口流动趋势分析1
python可视化:北方城市人口流动趋势分析1 斑点鱼在做销售数据分析时发现北京天津的同比下滑明显,客流下滑明显。而山东保定的客流同比上升。引起了斑点鱼对于北方人口流动的好奇。 所以本文将分析2025年北方地区(北京、天津、河北、山东、山西、辽宁等)…...
wps excel 常用操作
数据分列 对于有分隔规律的内容,可以通过分隔符将该内容进行分列 例如,以下字符串,可使用Excel对包含IP地址、数据库类型、环境、负责人和日期的字符串进行分列: 192.168.175.211-MySQL 数据库-DEV-李华-2025.06.30 将以上字符串…...
云智融合普惠大模型AI,政务服务重构数智化路径
2025年是“十四五”收官之年,数字政府和政务数智化作为“数字中国”建设的重点,已经取得了显著成效。根据《联合国电子政务调查报告2024》,我国电子政务发展指数全球排名第35位,与2022年相比提升8个名次;其中ÿ…...
全行业软件定制:APP/小程序/系统开发与物联网解决方案
在数字化浪潮席卷全球的今天,软件已经渗透到我们生活的方方面面,成为推动社会进步的重要力量。作为一家专注于专业软件定制开发的公司,哲科软件深知每一个行业、每一个企业都有其独特的需求和痛点。因此,我们致力于提供个性化软件…...
Java虚拟机(JVM)家族发展史及版本对比
Java虚拟机(JVM)家族发展史及版本对比 一、JVM家族发展史 1. 早期阶段(1996-2000) Classic VM(Java 1.0-1.1): 厂商:Sun Microsystems(Oracle前身)。特点&…...
电脑怎么强制退出程序回到桌面 详细操作步骤
电脑日常使用过程中,我们有时会遇到程序无响应或卡死的情况,这时需要采取措施强制关闭这些程序才能保持电脑的正常工作和运行。那么,电脑如何强制退出程序呢?其实方法有很多种,下面便为大家介绍几种电脑强制关闭程序的…...
蓝牙 LE:安全模式和程序说明(蓝牙中的网络安全)
在蓝牙低功耗 (BLE) 中,安全性是一个多方面的难题。了解 BLE 的三种主要安全模式以及五个关键的 BLE 安全程序。 毫无疑问,低功耗蓝牙 (BLE) 技术的迅猛发展为我们的生活带来了更多便利。然而,随着低功耗蓝牙设备的普及,人们对其安全性的担忧也日益加剧。 与普遍看法相反…...
低代码平台开发胎压监测APP
项目介绍 该项目是一个利用Flutter框架和蓝牙技术实现轮胎压力实时监测的应用。 主要功能如下: 用于接收蓝牙模块传输的胎压数据,并实时显示胎压值。APP对接收到的胎压数据进行处理,如单位转换、数据滤波等,然后将处理后的胎压值…...
GNOME扩展入门:日期时间
Getting Started | GNOME JavaScript 1.扩展路径 ~/.local/share/gnome-shell/extensions/ 2.新建文件夹 datetimesonichy 3.metadata.json {"uuid": "datetimesonichy","name": "datetime","description": "Dis…...
NLP高频面试题(五十二)——深度学习优化器详解
在深度学习的训练过程中,各种基于梯度的优化器肩负着寻找损失函数最优解的重任。最基础的梯度下降法通过沿着损失函数负梯度方向迭代更新参数,实现对模型参数的优化;而随机梯度下降(SGD)则以更高的计算效率和内存利用率在大规模数据集上大放异彩,但也因更新噪声大、易陷入…...