当前位置: 首页 > news >正文

C++模板知识

目录

引言 

一、非类型模板参数

二、类模板的特化 

(一)概念 

(二)函数模板特化 

(三)类模板特化 

1. 全特化 

2. 偏特化 

(四)类模板特化应用示例 

三、模板的分离编译 

(一)什么是分离编译 

(二)模板的分离编译 

(三)解决方法 

四、模板总结 

(一)优点 

(二)缺陷 


引言

在C++编程世界里,模板是一项极为强大且灵活的特性,它能让我们编写出通用、可复用的代码。今天,就让我们深入探究C++模板的几个关键方面:非类型模板参数、类模板的特化以及模板的分离编译。
 

一、非类型模板参数

模板参数分为类型形参与非类型形参。类型形参,我们常见于模板参数列表中,通常紧跟在 class 或者 typename 之后。而非类型模板参数则别具一格,它使用一个常量作为类(函数)模板的一个参数,在模板中可当作常量使用。
 
代码示例
 

cpp   
namespace bite {// 定义一个模板类型的静态数组template<class T, size_t N = 10>class array {public:T& operator[](size_t index) { return _array[index]; }const T& operator[](size_t index) const { return _array[index]; }size_t size() const { return _size; }bool empty() const { return 0 == _size; }private:T _array[N];size_t _size;};
}


 注意事项
 
1. 浮点数、类对象以及字符串是不允许作为非类型模板参数的,用整形初始化
 
2. 非类型的模板参数必须在编译期就能确认结果。
 

二、类模板的特化
 

(一)概念
 

模板能实现与类型无关的代码,但遇到特殊类型时,可能会产生错误结果,这就需要对模板进行特化。特化即在原模板类基础上,针对特殊类型进行特殊化的实现方式。模板特化主要分为函数模板特化与类模板特化。
 

(二)函数模板特化
 

特化步骤
 
1. 首先得有一个基础的函数模板。
 
2. 使用关键字 template 后跟一对空的尖括号 <> 。
 
3. 函数名后紧跟一对尖括号,在尖括号中指定需要特化的类型。
 
4. 函数形参表必须要和模板函数的基础参数类型完全相同,否则不同编译器可能会报奇怪错误。


代码示例
 

cpp   
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right) {return left < right;
}// 对Less函数模板进行特化
template<>
bool Less<Date*>(Date* left, Date* right) {return *left < *right;
}int main() {cout << Less(1, 2) << endl;Date d1(2022, 7, 7);Date d2(2022, 7, 8);cout << Less(d1, d2) << endl;Date* p1 = &d1;Date* p2 = &d2;cout << Less(p1, p2) << endl;  // 调用特化之后的版本,而不走模板生成了return 0;
}


 
一般情况下,如果函数模板遇到不能处理或者处理有误的类型,为实现简单,通常直接给出特化版本。函数模板不建议过度特化,因为直接编写普通函数实现简单明了,代码可读性高。
 

(三)类模板特化
 

1. 全特化
 

全特化即将模板参数列表中所有的参数都确定化。
 

cpp   
template<class T1, class T2>
class Data {
public:Data() { cout << "Data<T1, T2>" << endl; }
private:T1 _d1;T2 _d2;
};template<>
class Data<int, char> {
public:Data() { cout << "Data<int, char>" << endl; }
private:int _d1;char _d2;
};


 

2. 偏特化
 

偏特化是针对模板参数进一步进行条件限制设计的特化版本,主要有以下两种表现方式:
 
- 部分特化:将模板参数类表中的一部分参数特化。
 

cpp   
// 将第二个参数特化为int
template <class T1>
class Data<T1, int> {
public:Data() { cout << "Data<T1, int>" << endl; }
private:T1 _d1;int _d2;
};


 
 
- 参数更进一步的限制:不仅特化部分参数,还针对模板参数做更进一步的条件限制。
 

cpp   
// 两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data<T1*, T2*> {
public:Data() { cout << "Data<T1*, T2*>" << endl; }
private:T1* _d1;T2* _d2;
};// 两个参数偏特化为引用类型
template <typename T1, typename T2>
class Data<T1&, T2&> {
public:Data(const T1& d1, const T2& d2) : _d1(d1), _d2(d2) {cout << "Data<T1&, T2&>" << endl;}
private:const T1& _d1;const T2& _d2;
};


 

(四)类模板特化应用示例
 


以按照小于比较的类模板 Less 为例:
 

cpp   
#include<vector>
#include <algorithm>template<class T>
struct Less {bool operator()(const T& x, const T& y) const {return x < y;}
};int main() {Date d1(2022, 7, 7);Date d2(2022, 7, 6);Date d3(2022, 7, 8);vector<Date> v1;v1.push_back(d1);v1.push_back(d2);v1.push_back(d3);// 可以直接排序,结果是日期升序sort(v1.begin(), v1.end(), Less<Date>());vector<Date*> v2;v2.push_back(&d1);v2.push_back(&d2);v2.push_back(&d3);// 此处直接排序结果错误,因为sort最终按照Less模板中方式比较,只会比较指针,而非指针指向内容// 此时需要特化Less类模板来处理sort(v2.begin(), v2.end(), Less<Date*>());return 0;
}// 对Less类模板按照指针方式特化
template<>
struct Less<Date*> {bool operator()(Date* x, Date* y) const {return *x < *y;}
};


 

三、模板的分离编译
 

(一)什么是分离编译
 


一个程序(项目)由若干个源文件共同实现,每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件,这种模式就是分离编译模式。
 


(二)模板的分离编译
 


当模板的声明与定义分离开,在头文件中声明,源文件中定义时,会出现问题。例如:
a.h
 

cpp   
template<class T>
T Add(const T& left, const T& right);a.cppcpp   
template<class T>
T Add(const T& left, const T& right) {return left + right;
}main.cppcpp   
#include "a.h"
int main() {Add(1, 2);Add(1.0, 2.0);return 0;
}


 
在这种情况下, a.cpp 中编译器没看到对 Add 模板函数的实例化,不会生成具体的加法函数; main.cpp 编译后在链接时找不到 Add<int> 与 Add<double> 的具体代码,就会报错。
 

(三)解决方法
 


1. 将声明和定义放到一个文件“xxx.hpp”里或者 xxx.h 也可以,推荐这种方式。
 
2. 模板定义的位置显式实例化,但这种方法不实用,不推荐。

 

cpp   
template<class T>
T Add(const T& left, const T& right);a.cppcpp   
template<class T>
T Add(const T& left, const T& right) 
{return left + right;
}// template
//int Add(const int& left, const int& right) 
// template
//double Add(const double& left, const double& right) main.cppcpp   
#include "a.h"
int main() 
{Add(1, 2);Add(1.0, 2.0);return 0;
}


四、模板总结
 

(一)优点
 


1. 模板复用了代码,节省资源,能实现更快的迭代开发,C++的标准模板库(STL)就是基于模板产生的。
 
2. 增强了代码的灵活性,能适应多种数据类型。
 


(二)缺陷
 

1. 模板会导致代码膨胀问题,编译时会针对不同类型实例化出多份代码,也会使编译时间变长。
 
2. 出现模板编译错误时,错误信息非常凌乱,难以定位错误根源。
 
希望通过这篇博客,大家能对C++模板有更深入、全面的理解,在今后的编程中能更好地运用模板特性编写出高质量、可复用的代码。

相关文章:

C++模板知识

目录 引言 一、非类型模板参数 二、类模板的特化 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;函数模板特化 &#xff08;三&#xff09;类模板特化 1. 全特化 2. 偏特化 &#xff08;四&#xff09;类模板特化应用示例 三、模板的分离编译 …...

MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 MCP 探索:微软 Microsoft MarkItDown MCP ,可把 Word、Excel 等转换成 MarkDown 格式…...

文本中地理位置提取方法—正则和NLP模型

这里写目录标题 一、提取地址列后12个字二、正则表达式删除不需要的文本三、保留关键字并删除之后的字四、相似度计算&#xff0c;查重五、去重 大量的文本中识别数据&#xff0c;要充分考虑效率和准确率。本文的方案是通过正则和NLP门址模型联合识别的方案。 首先利用现有粗略…...

AI大模型-RAG到底能做些什么?

RAG常见的应用场景&#xff0c;有以下几个方面&#xff1a; 1.智能客服系统&#xff1a;比如电商领域&#xff0c;对客户提出的常见问题&#xff0c;进行自动回复。减少人力成本。 2.人力资源管理&#xff1a;一个新的员工&#xff0c;入职一家大型公司&#xff0c;公司中有各…...

【算法基础】冒泡排序算法 - JAVA

一、算法基础 1.1 什么是冒泡排序 冒泡排序是一种简单直观的比较排序算法。它重复地走访待排序的数列&#xff0c;依次比较相邻两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有元素需要交换为止。 1.2 基本思想 比较相邻元素&#xff1a;从头开始&#xf…...

Nginx搭建test服务器

创建test域名 进入阿里云添加解析 创建域名&#xff1a;test.xxxxx.com 服务器复制项目代码 新建目录&#xff0c;Git拉取项目代码&#xff0c;安装上插件包 修改配置文件&#xff0c;启动测试服务 修改配置文件“服务器接口” 开启服务pm2 start app.js --name "t…...

依赖倒置原则

当然可以&#xff01;这次我们来详细讲解 依赖倒置原则&#xff08;DIP: Dependency Inversion Principle&#xff09;&#xff0c;它是 SOLID 五大设计原则中的压轴&#xff0c;也是最关键的“架构型原则”。 我将从&#xff1a; 什么是依赖倒置原则&#xff08;定义&#x…...

PostgreSQL 的 VACUUM 与 VACUUM FULL 详解

PostgreSQL 的 VACUUM 与 VACUUM FULL 详解 一、基本概念对比 特性VACUUMVACUUM FULL定义常规维护操作&#xff0c;清理死元组激进重组操作&#xff0c;完全重写表数据锁级别不阻塞读写(共享锁)排他锁(阻塞所有操作)空间回收只标记空间为可用&#xff0c;不返还OS空间返还操作…...

SQL面试题——留存分析之使用bitmap 计算留存

使用bitmap 计算留存 之前我们说过,留存分析其实在企业数据分析中,是很基础但是也很重要的,留存分析可以反映产品的发展是否健康,是否可持续发展,之前我们介绍过,可以看看之前的文章 SQL面试题——留存分析 因为使用工具的限制,所以我们实现方式也会有所不同,之前我们…...

P2415集合求和 题解

P2415 集合求和 题解 公式推导&#xff1a; 设集合有 n 个元素&#xff0c;记为 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1​,a2​,…,an​。 每个子集要么包含某个元素&#xff0c;要么不包含。 我们固定某个元素 a k a_k ak​&#xff0c;再从剩下的 n − 1 n -…...

【2025年五一数学建模竞赛】C题 完整论文 模型建立与求解

目录 2025年五一数学建模竞赛 C题完整论文&#xff1a;建模与求解 Matlab代码一、问题重述二、模型假设与符号说明2.1 模型基本假设2.2 符号说明 问题一&#xff1a;预测博主新增关注数问题二&#xff1a;预测用户的新关注行为问题三&#xff1a;预测用户在线状态及互动博主问题…...

wpf 输入框 在输入时去除水印

wpf ScrollViewer 在输入数据时去除水印 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;ScrollViewer控件通常用于显示滚动内容。如果你想在ScrollViewer中使用数据输入&#xff08;例如文本输入&#xff09;&#xff0c;并且希望在输入时去除水…...

数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)

资料解读&#xff1a;智慧机场解决方案与应用 详细资料请看本解读文章的最后内容。 随着科技的飞速发展&#xff0c;智慧机场的建设已成为现代机场发展的重要方向。智慧机场不仅提升了旅客的出行体验&#xff0c;还极大地提高了机场的运营效率。本文将详细解读沃土数字平台在…...

C语言-指针(二)

一级指针 一级指针指的是存储了变量地址的指针 一级指针的变量类型是 类型 * 一级指针的类型与变量的类型有些不同 例&#xff1a;int * p 前面的int * 是该地址的类型 int a 0; int * p a; 这里的指针 p 就是一级指针 二级指针 指针变量也是变量因此也会有地…...

React 组件prop添加类型

给函数的props做注解 import { useState } from reacttype Props { className:string,title?:string } // 自定义一个Button组件 function Button(props:Props){// 解构出classname\const {className} propsreturn <button className{className}>点击我</button&g…...

Spring Boot中集成Guava Cache或者Caffeine

一、在Spring Boot(1.x版本)中集成Guava Cache 注意&#xff1a; Spring Boot 2.x用户&#xff1a;优先使用Caffeine&#xff0c;性能更优且维护活跃。 1. 添加依赖 在pom.xml中添加Guava依赖&#xff1a; <dependency><groupId>com.google.guava</groupId&…...

全感官交互革命:当 AI 大模型学会 “看、听、说、创”

引言&#xff1a;从 “文字对话” 到 “全感官体验”&#xff0c;AI 正在重塑人类认知边界 当 AI 不再局限于文本对话&#xff0c;而是能 “看懂” 图像、“听懂” 语音、“生成” 视频&#xff0c;并将这些模态无缝融合时&#xff0c;一场关于人机交互的革命已然开启。DeepSe…...

Linux 库文件详解

Linux 库文件详解 一、库文件概述 库文件是预先编译好的方法的集合&#xff0c;它为程序员提供了一种方便的方式来复用代码。在 Linux 系统中&#xff0c;主要有两种类型的库文件&#xff1a;静态库和共享库。 静态库&#xff08;.a 文件&#xff09; 使用静态库&#xff0…...

蒙特卡罗方法(Monte Carlo Method)​​:基于随机采样的数值计算与模拟技术

​​核心思想​​ 蒙特卡罗方法通过​​随机采样​​和​​统计模拟​​解决数学、物理、工程等领域的复杂问题&#xff0c;其核心是利用​​大数定律​​——当样本量足够大时&#xff0c;样本均值会收敛于期望值。 ​​关键特点​​&#xff1a; ​​无维度诅咒​​&#x…...

HTTPS协议:更安全的HTTP

目录 1. 前言 2. HTTP 与 HTTPS&#xff1a;安全的分水岭 2.1 HTTP 的安全隐患 2.2 HTTPS 的安全提升 3. HTTPS 的核心概念 3.1 加密三剑客&#xff1a;对称加密、非对称加密与哈希算法 3.2 SSL/TLS 握手过程&#xff1a;建立安全通道的关键步骤 3.3 数字证书&#xff…...

Flutter BottomNavigationBar 详解

目录 一、引言 二、BottomNavigationBar 的基本用法 三、主要属性 1. 基本配置 2. 导航项配置 3. 导航类型选择 四、高级功能实现 1. 结合 PageView 实现滑动切换 2. 添加徽章提示 3. 自定义凸起按钮&#xff08;FAB融合&#xff09; 4. 渐变背景实现 五、自定义 B…...

吴恩达深度学习作业 RNN模型——字母级语言模型

一. 简单复习一下RNN RNN RNN适用于处理序列数据&#xff0c;令是序列的第i个元素&#xff0c;那么就是一个长度为的序列&#xff0c;NLP中最常见的元素是单词&#xff0c;对应的序列是句子。 RNN使用同一个神经网络处理序列中的每一个元素。同时&#xff0c;为了表示序列的…...

数字时代,如何为个人信息与隐私筑牢安全防线?

首席数据官高鹏律师团队编著 在当今数字化时代&#xff0c;个人信息和隐私保护至关重要。我们在享受数字生活带来的便利时&#xff0c;也面临着个人信息泄露、隐私被侵犯的风险。下面将从先进技术和法律途径两个方面&#xff0c;探讨如何严格保护个人信息和隐私。 一、先进技…...

javascript交换值最好三种

代码 1. 位运算(性能高&#xff0c;但只能用于整数) var a15; var b32; console.log(a) //15 console.log(b) //32 a a ^ b; b a ^ b; a a ^ b; console.log(a) //32 console.log(b) //152. 数组结构(性能高&#xff0c;但要ES6) var a15; var b32; console.log(…...

C++-Lambda表达式

目录 1.什么是 Lambda&#xff1f; 2.例子&#xff1a;打印每个元素&#xff08;和 for_each 一起用&#xff09; 3.捕获外部变量&#xff08;Capture&#xff09; 3.1. 捕获值&#xff08;拷贝&#xff09;&#xff1a;[] 3.2. 捕获引用&#xff1a;[&] 3.3. 指定捕…...

逻辑回归的多分类实战:以鸢尾花数据集为例

文章目录 引言&#xff1a;从二分类到多分类一、多分类问题无处不在二、One-vs-All策略揭秘1. 核心思想2. 数学表达 三、鸢尾花分类完整实现1. 环境准备2. 数据加载与探索3. 数据预处理4. 模型训练与评估5. 决策边界可视化 四、关键参数解析五、总结 引言&#xff1a;从二分类到…...

[面试]SoC验证工程师面试常见问题(一)

SoC验证工程师面试常见问题(一) 摘要:在面试 SoC 验证工程师职位时,面试官通常会重点考察候选人对 SystemVerilog 和 UVM (Universal Verification Methodology) 的掌握程度,因为这两者是现代 IC 验证的核心技能。以下是可能会被问到的常见问题,涵盖 SystemVerilo…...

传统银行服务和 区块链支付无缝融合的一种解决方案

Dragonfly Capital 的合伙人 Alex Pack 曾表示:“DeFi 的目标是重构全球银行体系,并打造开放且无须许可的经营环境。”在 DeFi 的金融世界中,加密资产架构在区块链上,通过各个协议实现资产之间的高效转移和价值的实时流通,如 Metamask 钱包的自托管,Uniswap 的资产交易,…...

大语言模型能力评定探讨

有标准答案的评估&#xff08;选择题&#xff09; 评估语言模型能力的基本思路是准备输入和标准答案&#xff0c;比较不同模型对相同输入的输出 由于AI答题有各种各样答案&#xff0c;因此现在是利用选择题考察。 有一个知名的选择题的基准叫做Massive Multitask Language Und…...

解构区块链身份认证:从ID到零知识证明的实战指南

引言 在数字经济高速发展的今天&#xff0c;数字身份已成为个人与数字世界交互的核心凭证。传统中心化身份系统存在数据孤岛、隐私泄露、单点故障等痛点&#xff0c;而区块链技术凭借​​去中心化、不可篡改、可追溯​​的特性&#xff0c;为数字身份验证提供了革命性解决方案…...

IntelliJ IDEA 使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 一、创建项目 二、创建模块 【File】->【New】->【Module…】 三、创建包 【helloword】->【右击 src】->【New】->【Package】 四、创建类 【helloword】->【s…...

HBM的哪些事

命令操作 这也许是DDR往HBM演进的一些奇淫技巧。 本篇内容属于杂谈&#xff0c;关于HBM的奇淫技巧&#xff0c;随后出专题介绍。...

C++ std::initializer_list 详解

std::initializer_list 是 C11 引入的一个轻量级模板类&#xff0c;用于支持花括号初始化列表&#xff08;{1, 2, 3}&#xff09;的语义。它允许函数或构造函数接受任意长度的同类型初始化列表&#xff0c;是实现统一初始化&#xff08;{} 语法&#xff09;的核心组件。 1. 基本…...

网络原理 - 13(HTTP/HTTPS - 4 - HTTPS)

目录 HTTPS 是什么 不得不的策略 - 应对“运营商劫持” “加密” 是什么 分类 对称加密 非对称加密 HTTPS 工作原理 1&#xff09;引入对称加密 2&#xff09; 引入非对称加密 中间人攻击 引入证书 证书的验证过程 完&#xff01; HTTPS 是什么 HTTPS 也是一个应…...

当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?

当MCP撞进云宇宙:多芯片封装如何重构云计算的"芯"未来? 2024年3月,AMD发布了震撼业界的MI300A/B芯片——这颗为AI计算而生的"超级芯片",首次在单封装内集成了13个计算芯片(包括3D V-Cache缓存、CDNA3 GPU和Zen4 CPU),用多芯片封装(Multi-Chip Pac…...

Kotlin Flow流

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头&#xff08;数据源&#xff09;和几个水杯&#xff08;数据接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每个水杯来接水时&#xff0c;都要重新打开水龙头从…...

虚拟局域网(VLAN)实验(Cisco Packet Tracer)-路由器、交换机的基本配置

好的&#xff0c;我们来根据你提供的文档&#xff0c;一步步地在 Cisco Packet Tracer 中完成这个跨交换机划分 VLAN 的实验。 实验目标: 配置两台交换机 SW1 和 SW2&#xff0c;划分 VLAN 10 和 VLAN 20&#xff0c;配置 Trunk 链路&#xff0c;并测试同 VLAN 和跨 VLAN 的连…...

【论文速递】2025年09周 (Robotics/Embodied AI/LLM)

目录 LLM-Microscope&#xff1a;揭示标点符号在Transformers的上下文中的隐藏作用英文摘要中文摘要 SurveyX&#xff1a;通过大型语言模型实现学术调查自动化英文摘要中文摘要 数学推理的自我奖励校正英文摘要中文摘要 VideoGrain&#xff1a;调整时空关注以进行多元透明视频编…...

自主机器人模拟系统

一、系统概述 本代码实现了一个基于Pygame的2D自主机器人模拟系统&#xff0c;具备以下核心功能&#xff1a; 双模式控制&#xff1a;支持手动控制&#xff08;WASD键&#xff09;和自动导航模式&#xff08;鼠标左键设定目标&#xff09; 智能路径规划&#xff1a;采用改进型…...

DeepSeek构建非农预测模型:量化关税滞后效应与非线性经济冲击传导

AI分析&#xff1a;非农数据前瞻与关税影响的滞后性 根据AI模型对多维度经济指标的交叉验证&#xff0c;4月非农就业报告或呈现“增速放缓但未失速”的特征。当前市场共识预期为新增就业13.3万人&#xff08;前值22.8万&#xff09;&#xff0c;失业率维持4.2%&#xff0c;时薪…...

前端面经-VUE3篇--vue3基础知识(一)插值表达式、ref、reactive

一、计算属性(computed) 计算属性&#xff08;Computed Properties&#xff09;是 Vue 中一种特殊的响应式数据&#xff0c;它能基于已有的响应式数据动态计算出新的数据。 计算属性有以下特性&#xff1a; 自动缓存&#xff1a;只有当它依赖的响应式数据发生变化时&#xff…...

云原生后端架构的优势与最佳实践

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在过去的几年里,随着云计算和容器化技术的迅猛发展,云原生架构逐渐成为现代企业和开发团队构建和运维应用系统的首选方式。云原生架构通过高度的自动化、弹性伸缩、微服务化等特点,使得企业能够在不断变化…...

力扣838.推多米诺随笔

“生活就像海洋&#xff0c;只有意志坚强的人&#xff0c;才能到达彼岸。”—— 马克思 题目 n 张多米诺骨牌排成一行&#xff0c;将每张多米诺骨牌垂直竖立。在开始时&#xff0c;同时把一些多米诺骨牌向左或向右推。 每过一秒&#xff0c;倒向左边的多米诺骨牌会推动其左侧…...

aab转apk

一、 android34升级&#xff1a; 1、升级到安卓34&#xff08;蓝牙、图片&#xff09; 再蓝牙广播的地方加入Context.RECEIVER_EXPORTED 2、废弃了 BluetoothAdapter#enable() 和 BluetoothAdapter#disable()&#xff0c;需要修改 // 以前的蓝牙操作BluetoothManager bluetoo…...

LeetCode 560. 和为 K 的子数组 | 前缀和与哈希表的巧妙应用

文章目录 方法思路&#xff1a;前缀和 哈希表核心思想关键步骤 代码实现复杂度分析示例解析总结 题目描述 给定一个整数数组 nums 和一个整数 k&#xff0c;请统计并返回该数组中和为 k 的子数组的数量。 子数组是数组中连续的非空元素序列。 示例 输入&#xff1a;nums …...

【Hive入门】Hive性能调优:小文件问题与动态分区合并策略详解

目录 引言 1 Hive小文件问题概述 1.1 什么是小文件问题 1.2 小文件产生的原因 2 Hive小文件合并机制 2.1 hive.merge.smallfiles参数详解 2.2 小文件合并流程 2.3 合并策略选择 3 动态分区与小文件问题 3.1 动态分区原理 3.2 动态分区合并策略 3.3 动态分区合并流程…...

基于Springboot+Vue3.0的前后端分离的个人旅游足迹可视化平台

文章目录 0、前言1、前端开发1.1 登录注册页面1.2 首页1.3 足迹管理1.3.1 足迹列表1.3.2 添加足迹1.4 个人中心1.4.1 足迹成就1.4.2 个人信息1.4.3 我的计划2、后端开发2.1 用户接口开发2.2 足迹点接口2.3 旅游计划接口3、完整代码资料下载0、前言 项目亮点: 前端用户权限动态…...

安妮推广导航系统开心版多款主题网址推广赚钱软件推广变现一键统计免授权源码Annie

一、源码描述 这是一套推广导航源码&#xff08;Annie&#xff09;&#xff0c;基于Funadmin框架&#xff08;ThinkPHP8Layui &#xff09;&#xff0c;内置多款主题&#xff0c;可以用于网址推广&#xff0c;或者用于软件推广&#xff0c;PC端软件手机端软件&#xff0c;后台…...

单片机-STM32部分:1、STM32介绍

飞书文档https://x509p6c8to.feishu.cn/wiki/CmpZwTgHhiQSHZkvzjdc6c4Yn1g STM32单片机不是一款芯片&#xff0c;而是一个系列的芯片&#xff1f; STM32系列单片机是ST&#xff08;意法半导体&#xff09;公司开发的一套32位微控制器基于Arm Cortex()-M处理器&#xff0c;它包…...

PHP-session

PHP中&#xff0c;session&#xff08;会话&#xff09;是一种在服务器上存储用户数据的方法&#xff0c;这些数据可以在多个页面请求或访问之间保持。Session提供了一种方式来跟踪用户状态&#xff0c;比如登录信息、购物车内容等。当用户首次访问网站时&#xff0c;服务器会创…...