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

【C++进阶】关联容器:multimap类型

目录

一、multimap 基础概念与底层实现

1.1 定义与核心特性

1.2 底层数据结构

1.3 类模板定义

1.4 与其他容器的对比

二、multimap 核心操作详解

2.1 定义与初始化

2.2 插入元素

2.3 查找元素

2.4 删除元素

2.5 遍历元素

三、性能分析与适用场景

3.1 时间复杂度分析

3.2 适用场景

四、高级应用与进阶技巧

4.1 自定义比较函数

4.2 处理 “一对多” 关系

4.3 性能优化建议

4.4 与 map 的协同使用

五、常见问题与陷阱

5.1 为什么没有 operator []?

5.2 自定义比较函数的严格弱序

5.3 迭代器失效问题

六、实战案例:文件关键词索引系统

6.1 需求描述

6.2 代码实现

七、总结与最佳实践

7.1 使用场景总结

7.2 最佳实践

7.3 未来扩展

八、完整代码示例

九、结语

十、参考资料


在 C++ 标准库的关联容器中,multimap 是一种特殊的存在。它允许键(Key)重复,能够存储多个具有相同键的键值对,同时保持键的有序性。这种特性使得 multimap 在处理 “一对多” 关系(如课程与学生、标签与文章)时高效且便捷。

一、multimap 基础概念与底层实现

1.1 定义与核心特性

multimap 是 map 的 “兄弟” 容器,二者的核心区别在于:

  • 键的唯一性map 要求键唯一,multimap 允许键重复
  • 插入行为map 插入重复键时会被忽略,multimap 会直接插入新元素
  • 操作接口multimap 不提供 operator[](因键不唯一,无法直接通过键访问唯一值)

典型应用场景

  • 学生管理系统:同一个班级(键)对应多个学生(值)
  • 日志系统:同一个时间戳(键)对应多条日志记录(值)
  • 索引系统:同一个关键词(键)对应多个文档编号(值)

1.2 底层数据结构

multimap 与 map 一样,底层基于 红黑树(Red-Black Tree) 实现。红黑树是平衡二叉搜索树,保证插入、删除、查找的时间复杂度均为 O(log n)。与 map 的区别在于,multimap 允许红黑树节点存储相同键的元素,插入时不会检查键是否已存在,而是直接按顺序插入到合适位置(保持中序遍历的有序性)。

红黑树节点结构示意图:

1.3 类模板定义

template <class Key,class T,class Compare = std::less<Key>,class Allocator = std::allocator<std::pair<const Key, T>>
> class multimap;

1.4 与其他容器的对比

容器键唯一性有序性底层结构查找时间典型场景
map唯一有序红黑树O(log n)一对一映射
multimap允许重复有序红黑树O(log n)一对多映射(有序)
unordered_map唯一无序哈希表O (1)(平均)高速查找(无需顺序)
unordered_multimap允许重复无序哈希表O (1)(平均)高速一对多映射(无序)

二、multimap 核心操作详解

2.1 定义与初始化

#include <iostream>
#include <map>
#include <string>// 基本定义:键为 int,值为 string
std::multimap<int, std::string> mm;// 初始化方式 1:插入多个键值对
std::multimap<int, std::string> scores = {{100, "Alice"},{100, "Bob"},    // 键重复,合法{200, "Charlie"}
};// 初始化方式 2:通过迭代器范围
std::multimap<int, std::string> copyScores(scores.begin(), scores.end());

2.2 插入元素

multimap 提供多种插入方式,均允许键重复:

方式一:insert 函数

// 插入单个键值对(推荐)
mm.insert(std::make_pair(300, "David"));
mm.insert({300, "Eve"});  // C++11 统一初始化语法// 插入另一个 multimap 的元素
mm.insert(copyScores.begin(), copyScores.end());

方式二:emplace 就地构造

// 直接构造对象,避免临时对象拷贝
mm.emplace(400, "Frank");

2.3 查找元素

由于键可能重复,multimap 的查找需返回键的范围:

方法一:find 查找第一个匹配键 

auto it = mm.find(100);
if (it != mm.end()) {std::cout << "First entry for key 100: " << it->second << std::endl;  // 输出 Alice
}

方法二:equal_range 查找键的完整范围

auto range = mm.equal_range(100);
for (auto it = range.first; it != range.second; ++it) {std::cout << "Key 100 value: " << it->second << std::endl;
}
// 输出:
// Key 100 value: Alice
// Key 100 value: Bob

方法三:lower_bound 和 upper_bound

auto lower = mm.lower_bound(100);   // 第一个 >= 100 的键
auto upper = mm.upper_bound(100);   // 第一个 > 100 的键
for (auto it = lower; it != upper; ++it) {// 遍历键为 100 的所有元素
}

2.4 删除元素

删除指定键的所有元素

size_t count = mm.erase(100);  // 返回删除的元素个数(此处为 2)
std::cout << "Erased " << count << " entries for key 100" << std::endl;

删除单个元素(通过迭代器)

auto it = mm.find(200);
if (it != mm.end()) {mm.erase(it);  // 删除键为 200 的第一个元素
}

2.5 遍历元素

// 正向遍历(按键的升序排列)
for (const auto& entry : mm) {std::cout << entry.first << ": " << entry.second << std::endl;
}// 反向遍历(按键的降序排列)
for (auto it = mm.rbegin(); it != mm.rend(); ++it) {std::cout << it->first << ": " << it->second << std::endl;
}

三、性能分析与适用场景

3.1 时间复杂度分析

操作平均复杂度最坏复杂度
插入(insert)O(log n)O(n)
删除(erase)O(log n)O(n)
查找(find)O(log n)O(n)

注意:红黑树的性能在极端情况下可能退化为O(n),但通过自动平衡机制,这种情况发生的概率极低。

3.2 适用场景

  • 一对多关系存储:如学生成绩管理(同名学生不同分数)、电话簿(同名多号码)。
  • 范围查询需求:需要频繁按键范围查询数据(如时间区间内的日志记录)。
  • 有序性要求:数据需要按键自动排序,且支持高效插入/删除。

对比其他容器

  • map:键唯一,适合一对一映射。
  • unordered_multimap:基于哈希表,无序但平均O(1)查找,适合高频查询场景。
  • vector/list:无序容器,需手动维护排序。

四、高级应用与进阶技巧

4.1 自定义比较函数

默认情况下,multimap 使用 std::less<Key> 进行键的排序。若需自定义排序规则(如降序、自定义结构体比较),需在声明时指定比较函子。

示例:降序排序

struct DescCompare {bool operator()(int a, int b) const {return a > b;  // 降序排列}
};std::multimap<int, std::string, DescCompare> reversedMm;
reversedMm.insert({100, "A"});
reversedMm.insert({200, "B"});
// 遍历顺序:200, 100

示例:结构体键的比较

struct Student {int grade;std::string name;// 自定义比较:先按成绩降序,同成绩按姓名升序bool operator<(const Student& other) const {if (grade != other.grade) {return grade > other.grade;}return name < other.name;}
};// 使用 Student 作为键类型
std::multimap<Student, int> studentScores;
studentScores.insert({{90, "Alice"}, 1001});
studentScores.insert({{90, "Bob"}, 1002});  // 键相同,允许插入

4.2 处理 “一对多” 关系

multimap 的核心价值在于高效存储同一键的多个值,典型场景如下:

场景:课程与学生管理

// 课程编号为键,学生姓名为值
std::multimap<int, std::string> courseStudents;// 插入数据:课程 101 有多个学生
courseStudents.insert({101, "Alice"});
courseStudents.insert({101, "Bob"});
courseStudents.insert({102, "Charlie"});// 查询课程 101 的所有学生
auto [lower, upper] = courseStudents.equal_range(101);
std::cout << "Course 101 students:" << std::endl;
for (auto it = lower; it != upper; ++it) {std::cout << "- " << it->second << std::endl;
}

4.3 性能优化建议

  • 批量插入:使用 insert 插入迭代器范围或初始化列表,减少红黑树旋转次数

  • 预分配内存:通过 reserve 预分配空间(虽然红黑树无容量概念,但可减少重新分配次数)

  • 避免频繁修改键:键是 const 类型,修改键需先删除旧元素再插入新元素 

4.4 与 map 的协同使用

当需要 “键 - 值列表” 映射时,可使用 map<Key, vector<Value>>,但 multimap 在插入时更便捷:

// 使用 map + vector 实现一对多
std::map<int, std::vector<std::string>> mapWithVector;
mapWithVector[100].push_back("Alice");
mapWithVector[100].push_back("Bob");  // 需要手动管理 vector// 使用 multimap 更简洁
std::multimap<int, std::string> mm;
mm.insert({100, "Alice"});
mm.insert({100, "Bob"});  // 直接插入,无需预分配 vector

五、常见问题与陷阱

5.1 为什么没有 operator []?

map 的 operator[] 通过键访问唯一值,而 multimap 中键可能对应多个值,无法通过单一值返回,因此未提供该接口。若需模拟类似功能,需手动插入: 

// map 的用法(唯一值)
map[100] = "Alice";  // 若键不存在则插入,存在则覆盖// multimap 需用 insert
mm.insert({100, "Alice"});  // 允许重复插入

5.2 自定义比较函数的严格弱序

比较函数必须满足 严格弱序(Strict Weak Ordering)

  • 非自反性:!(a < a)
  • 传递性:若 a < b 且 b < c,则 a < c
  • 反对称性:若 a < b,则 b < a 不成立

错误示例(非严格弱序,导致未定义行为):

// 错误:比较函数不满足非自反性
struct BadCompare {bool operator()(int a, int b) const { return a <= b; }  // a <= b 允许 a==b,导致自反
};

5.3 迭代器失效问题

  • 插入、删除操作不会使其他迭代器失效(红黑树节点替换而非销毁)
  • 但删除元素后,指向该元素的迭代器会失效

六、实战案例:文件关键词索引系统

6.1 需求描述

实现一个学生课程管理系统,支持:

  • 添加学生选课记录(允许同一学生选择多门课程)。
  • 按学生姓名查询所有选课记录。
  • 按课程名称查询所有选课学生。

6.2 代码实现

#include <iostream>
#include <map>
#include <string>int main() {// 使用multimap存储学生-课程关系(允许重复)std::multimap<std::string, std::string> studentCourses;// 添加选课记录studentCourses.insert({"Alice", "Math"});studentCourses.insert({"Alice", "Physics"});studentCourses.insert({"Bob", "Chemistry"});studentCourses.insert({"Alice", "Biology"});// 按学生查询课程std::string targetStudent = "Alice";auto range = studentCourses.equal_range(targetStudent);std::cout << targetStudent << "'s courses:" << std::endl;for (auto it = range.first; it != range.second; ++it) {std::cout << "- " << it->second << std::endl;}// 按课程查询学生(需反向multimap)std::multimap<std::string, std::string> courseStudents;for (const auto& pair : studentCourses) {courseStudents.insert({pair.second, pair.first});}std::string targetCourse = "Physics";auto courseRange = courseStudents.equal_range(targetCourse);std::cout << "\nStudents in " << targetCourse << ":" << std::endl;for (auto it = courseRange.first; it != courseRange.second; ++it) {std::cout << "- " << it->second << std::endl;}return 0;
}

 

七、总结与最佳实践

7.1 使用场景总结

  • 键可重复且需有序:如日志系统、索引系统、分类系统
  • 简化 “一对多” 操作:避免手动管理 map + vector 的嵌套结构
  • 范围查询需求:利用 lower_bound/upper_bound 进行高效区间操作

7.2 最佳实践

  • 优先使用 insert 插入:避免依赖 operator[]multimap 不支持)
  • 处理重复键时使用范围迭代:通过 equal_range 或 lower_bound/upper_bound 遍历所有相关元素
  • 自定义比较函数时严格遵循严格弱序:确保红黑树的有序性不受破坏
  • 对比选择容器
    • 若需要键唯一且有序:用 map
    • 若需要键可重复但无需有序:用 unordered_multimap
    • 若需要值可重复且键值相同:用 multiset

7.3 未来扩展

C++ 标准库不断进化,虽然 multimap 的接口相对稳定,但结合 Lambda 表达式可更简洁地定义比较函数(C++14 起):

// 使用 Lambda 作为比较函数(C++14+)
auto lambdaCompare = [](int a, int b) { return a > b; };
std::multimap<int, std::string, decltype(lambdaCompare)> mm(lambdaCompare);

八、完整代码示例

示例 1:基本操作演示

#include <iostream>
#include <map>
#include <string>int main() {std::multimap<int, std::string> mm;// 插入元素mm.insert({100, "Alice"});mm.insert({100, "Bob"});mm.insert({200, "Charlie"});// 查找键 100 的所有值auto range = mm.equal_range(100);std::cout << "Values for key 100:" << std::endl;for (auto it = range.first; it != range.second; ++it) {std::cout << "- " << it->second << std::endl;}// 删除键 100 的所有元素mm.erase(100);std::cout << "Size after erase: " << mm.size() << std::endl;  // 输出 1return 0;
}

 

示例 2:自定义比较函数

#include <iostream>
#include <map>struct DescCompare {bool operator()(int a, int b) const { return a > b; }
};int main() {std::multimap<int, std::string, DescCompare> reversedMm;reversedMm.insert({100, "A"});reversedMm.insert({200, "B"});// 反向遍历输出(实际存储顺序为 200, 100)for (const auto& entry : reversedMm) {std::cout << entry.first << ": " << entry.second << std::endl;}return 0;
}

 

九、结语

multimap 是处理 “有序重复键” 场景的利器,其红黑树底层保证了高效的插入、删除和查找操作。通过合理使用范围查询接口和自定义比较函数,能轻松构建复杂的数据映射系统。在实际项目中,需根据键的唯一性、有序性和性能需求,灵活选择 mapmultimapunordered_map 等容器,以实现代码的高效与优雅。

十、参考资料

  •  《C++ Primer(第 5 版)》这本书是 C++ 领域的经典之作,对 C++ 的基础语法和高级特性都有深入讲解。
  • 《Effective C++(第 3 版)》书中包含了很多 C++ 编程的实用建议和最佳实践。
  • 《C++ Templates: The Complete Guide(第 2 版)》该书聚焦于 C++ 模板编程,而using声明在模板编程中有着重要应用,如定义模板类型别名等。
  • C++ 官方标准文档:C++ 标准文档是最权威的参考资料,可以查阅最新的 C++ 标准(如 C++11、C++14、C++17、C++20 等)文档。例如,ISO/IEC 14882:2020 是 C++20 标准的文档,可从相关渠道获取其详细内容。
  • :这是一个非常全面的 C++ 在线参考网站,提供了详细的 C++ 语言和标准库文档。
  • :该网站提供了系统的 C++ 教程,配有丰富的示例代码和清晰的解释,适合初学者学习和理解相关知识。
  • 《Effective STL》Scott Meyers

  • 开源项目STL源码分析


相关文章:

【C++进阶】关联容器:multimap类型

目录 一、multimap 基础概念与底层实现 1.1 定义与核心特性 1.2 底层数据结构 1.3 类模板定义 1.4 与其他容器的对比 二、multimap 核心操作详解 2.1 定义与初始化 2.2 插入元素 2.3 查找元素 2.4 删除元素 2.5 遍历元素 三、性能分析与适用场景 3.1 时间复杂度分…...

学习threejs,使用EffectComposer后期处理组合器(采用RenderPass、FilmPass渲染通道)

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.EffectComposer 后期…...

用Django和AJAX创建一个待办事项应用

用Django和AJAX创建一个待办事项应用 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 用Django和AJAX创建一个待办事项应用让我们创建一个简单的 Django 项目,其中包含不同类型的 A…...

​【微调大模型】使用LLaMA-Factory进行监督微调 Qwen2.5 ​

本文使用LLaMA-Factory进行监督微调 Qwen2.5。 此监督微调&#xff08;SFT&#xff09;脚本具有以下特点&#xff1a; 支持单GPU和多GPU训练&#xff1b;支持全参数调优&#xff0c;LoRA&#xff0c;Q-LoRA&#xff0c;Dora。 下面详细介绍一下该脚本的使用方法。 目录 安装…...

前端 react+ant design ,后端 springboot +mysql+redis 全栈项目零基础小白从服务器初始化开始部署上线超详细保姆级教程

哈喽小伙伴们,好久不见,我是小李,今天,来电干货,希望对大家有帮助。 去年12月底的时候心血来潮,正好赶上腾讯云在做活动,就买了一台服务器,说是后面打算上线一两个项目,体验体验云服务器究竟是怎么玩的。后来由于实习和“冬招”,实在忙不过来了,就放在文件夹吃灰了…...

[Windows] OfficeAI 助手 v0.3.20(长期免费,2025-03-18 本地支持WPS_Word联动)

OfficeAI助手&#xff0c;作为Microsoft Office与WPS的得力智能插件&#xff0c;集文档自动生成、内容精准校对与润色、公式智能推荐等多功能于一体。它凭借强大的数据分析能力&#xff0c;深度融入Office/WPS办公生态&#xff0c;一键简化复杂流程&#xff0c;让办公效率倍增&…...

3DGS之光栅化

光栅化&#xff08;Rasterization&#xff09;是计算机图形学中将连续的几何图形&#xff08;如三角形、直线等&#xff09;转换为离散像素的过程&#xff0c;最终在屏幕上形成图像。 一、光栅化的核心比喻 像画家在画布上作画 假设你是一个画家&#xff0c;要把一个3D立方体画…...

可发1区的超级创新思路(python 、MATLAB实现):基于SAM+Informer+2DCNN的功率预测模型

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 目录 首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 一、模型背景与核心创新 二、模型组件详解 1. SAM时空注意力模块 原理说明 代码实…...

【Java面试系列】Spring Boot微服务架构下的分布式事务解决方案与性能优化详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot微服务架构下的分布式事务解决方案与性能优化详解 - 3-5年Java开发必备知识 1. 引言 在当今的微服务架构中&#xff0c;分布式事务是一个不可避免的话题。随着业务复杂度的提升&#xff0c;如何保证跨服务的数据一致性成为开发者和架构师必须面对…...

【MATLAB第114期】基于MATLAB的SHAP可解释神经网络分类模型(敏感性分析方法)

【MATLAB第114期】基于MATLAB的SHAP可解释神经网络分类模型&#xff08;敏感性分析方法&#xff09; 引言 该文章实现了一个可解释的神经网络分类模型&#xff0c;使用BP神经网络&#xff08;BPNN&#xff09;来预测特征输出。该模型利用12个变量参数作为输入特征进行训练。为…...

WPS免费使用宏(安装VBA插件)

WPS提示要开会员才能使用宏&#xff0c;多次搜索发现其实可以直接安装VBA插件就行&#xff0c;Mark一下 插件下载地址&#xff1a; https://www.onlinedown.net/soft/10044362.htm ‘’’ WPS插件软件介绍 wps vba是一款wps office插件&#xff0c;安装wps vba 7.1就可以让of…...

让测试飞起来——DevOps中的自动化测试实践指南

让测试飞起来——DevOps中的自动化测试实践指南 近年来,DevOps理念已经成为现代软件开发和运维的“最佳拍档”。它倡导“开发”和“运维”的协作,核心目标是加速交付,同时保障软件质量。而在这一过程中,测试自动化扮演了不可替代的角色。今天,我们就一起来聊聊测试自动化…...

开源AI大模型AI智能名片S2B2C商城小程序:科技浪潮下的商业新引擎

摘要&#xff1a; 本文聚焦于科技迅猛发展背景下&#xff0c;开源AI大模型、AI智能名片与S2B2C商城小程序的融合应用。通过分析元宇宙、人工智能、区块链、5G等前沿科技带来的商业变革&#xff0c;阐述开源AI大模型AI智能名片S2B2C商城小程序在整合资源、优化服务、提升用户体验…...

webpack配置导致浏览器自动刷新

文章目录 关键配置 - liveReload 关键配置 - liveReload const dev_config {devtool: source-map,// watch: true,devServer: {contentBase: path.resolve(__dirname, bin),port: 8005,host:192.168.xx.xx,inline: true,hot: false,liveReload: false //关键这一行【false不会…...

OPEX baota 2024.02.26

OPEX baota 2024.02.26 运维集成软件宝塔2024.02.26作废例子&#xff1a; 最重要的两个地方&#xff1a;上传文件 网站&#xff0c;重启应用服务器&#xff08;tomcat&#xff09; 其他很少用的...

【Pandas】pandas DataFrame to_numpy

Pandas2.2 DataFrame Conversion 方法描述DataFrame.astype(dtype[, copy, errors])用于将 DataFrame 中的数据转换为指定的数据类型DataFrame.convert_dtypes([infer_objects, …])用于将 DataFrame 中的数据类型转换为更合适的类型DataFrame.infer_objects([copy])用于尝试…...

Tensorflow2实现: LSTM-火灾温度预测

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 一&#xff1a;理论知识基础 1.LSTM原理 一句话介…...

【降尺度】AI+CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析

气候变化已成为全球性挑战&#xff0c;对农业、生态系统、水资源、人类健康和社会经济系统产生深远影响。科学研究表明&#xff0c;自工业革命以来&#xff0c;人类活动导致的温室气体排放与全球气温上升、极端天气事件增加、冰川融化和海平面上升等现象密切相关。为科学理解和…...

粒子系统优化完成

按计划对幻世&#xff08;OurDream&#xff09;2D图形引擎的粒子系统进行了加强和优化&#xff0c;重点强化了粒子运动的控制和颜色混合效果的功能&#xff0c;目前优化过后的粒子系统的整体效果是令人满意的。...

spark-core编程

RDD转换算子 RDD 的两种算子&#xff1a;转换算子和行动算子。 RDD 根据数据处理方式的不同将算子整体上分为 Value 类型、双 Value 类型和 Key-Value 类型。 算子实际上是一些函数&#xff0c;用于数据处理。 Value类型 map 将处理的数据逐条进行映射转换&#xff0c;…...

智慧班牌系统解决方案,SaaS智慧电子班牌云平台

智慧班牌系统解决方案 系统概述 智慧班牌是智慧校园建设不断发展的产物&#xff0c;是教育信息化改革的载体。通过智慧班牌可以高效便捷传递各种知识信息和通知信息、及时反馈课堂信息、实现班级的透明化管理。智慧班牌将学生平安考勤、异常出勤情况及时反馈至家长、老师&…...

Flutter 2025 Roadmap

2025 这个路线图是有抱负的。它主要代表了我们这些在谷歌工作的人收集的内容。到目前为止&#xff0c;非Google贡献者的数量超过了谷歌雇佣的贡献者&#xff0c;所以这并不是一个详尽的列表&#xff0c;列出了我们希望今年Flutter能够出现的所有令人兴奋的新事物&#xff01;在…...

【开发工具】科研开发中的主流AI工具整理及如何使用GPT润色英文论文

一、主流AI工具 AI技术发展至今已经逐渐成熟&#xff0c;并可以取代一部分科研和开发中的简单工作&#xff0c;并为复杂工作提高辅助&#xff0c;除此之外也是更高级的信息检索工具。熟练掌握 AI 工具在当前市场理应具有竞争优势&#xff0c;目前笔者在科研和开发中接触过AI工…...

用excel做九乘九乘法表

公式&#xff1a; IF($A2>B 1 , 1, 1,A2 & “" & B$1 & “” & $A2B$1,”")...

nacos配置达梦数据库驱动源代码步骤

1.在父工程pom.xml添加依赖&#xff1a; <dependency><groupId>com.dameng</groupId><artifactId>DmJdbcDriver18</artifactId><version>8.1.1.193</version> </dependency> 2.在nacos-config模块pom.xml添加依赖&#xff1…...

Spring Boot 线程池配置详解

Spring Boot 线程池配置详解 一、核心配置参数及作用 基础参数核心线程数 (corePoolSize)‌ 作用‌:线程池中始终保持存活的线程数量,即使空闲也不回收‌。 建议‌:根据任务类型设定(如 I/O 密集型任务可设为 CPU 核心数 2)‌。 最大线程数 (maxPoolSize)‌ 作用‌:…...

如何使用 qrcode.react生成二维码

qrcode.react&#xff08;查看官网&#xff09; 是一个用于 React 应用的 QR 码生成组件。下面是如何使用它的详细指南&#xff1a; 1、安装 npm install qrcode.react # 或者 yarn add qrcode.react2、基本用法 import {QRCodeSVG} from qrcode.react;const myPage () >…...

用VScode来编写前后端——构建基础框架

前言 我写这一个板块的原因是我参加了我们学校的新生项目课&#xff0c;需要创立一个系统&#xff0c;我们小组选的标题的基于计算机视觉的商品识别系统&#xff0c;那么我们需要一个网站来展示我们的功能&#xff0c;故写这些来记录一下自己&#xff0c;大家如果有什么问题的话…...

23.OpenCV轮廓逼近与拟合

OpenCV轮廓逼近与拟合 在计算机视觉中&#xff0c;轮廓是图像中边界或形状的重要表达形式。然而&#xff0c;直接从图像中提取的轮廓常常包含大量冗余点&#xff0c;且噪声较多。为了更好地描述图像中的形状&#xff0c;我们通常需要对轮廓进行逼近和拟合&#xff0c;从而降低…...

Flutter Row / Column 组件详解

1. 引言 在 Flutter 中&#xff0c;Row 和 Column 是最常用的布局组件&#xff0c;用于在水平方向 (Row) 或垂直方向 (Column) 排列子组件。它们提供了强大的对齐方式、空间分配策略&#xff0c;适用于各种 UI 设计需求。本文将详细介绍它们的基本用法、主要属性及自定义样式。…...

WHAT - 表单场景 - 依赖联动

目录 示例场景技术栈示例代码功能点总结详情场景 - 依赖联动初始化示例说明&#xff1a;详情页场景&#xff08;含回显、联动&#xff09;修改点说明示例代码&#xff08;详情页&#xff09;总结一下关键点 下面是一个基于 React TypeScript Ant Design (antd) 的表单联动示例…...

SecProxy - 自动化安全协同平台

本人为甲方安全人员&#xff0c;从事甲方工作近6年&#xff1b;针对在甲方平时安全工作的一些重复、复杂、难点的工作&#xff0c;思考如何通过AI、脚本、或者工具实现智能且自动化&#xff0c;于是花平时空闲时间准备将这些能力全部集中到一个平台&#xff0c;于是有了这个东西…...

网络3 子网掩码 划分ip地址

1.根据子网掩码判断主机数 IP地址网络位主机位 核心&#xff1a;将主机位划分为子网位和主机位 疑问&#xff1a;子网位有什么作用 子网掩码&#xff1a;网络位全为1&#xff0c;主机位全为0 主机数2^主机位 -2 2.根据主机和子网判断子网掩码 有一个B类网络145.38.0.0需要划…...

电容详解:定义、作用、分类与使用要点

一、电容的基本定义 电容&#xff08;Capacitor&#xff09; 是由两个导体极板&#xff08;正负极&#xff09;和中间绝缘介质组成的储能元件&#xff0c;其基本特性为存储电荷。 公式&#xff1a; C Q / V C&#xff1a;电容值&#xff08;单位&#xff1a;法拉F&#xff09…...

Sublime Text for Mac v4.0 【注册汉化版】代码编辑器

Sublime Text for Mac v4.0 【注册汉化版】代码编辑器 一、介绍 sublime text for Mac一款轻量级的文本编辑器&#xff0c;拥有丰富的功能和插件。它支持多种编程语言&#xff0c;包括C、Java、Python、Ruby等&#xff0c;可以帮助程序员快速编写代码。Sublime Text的界面简洁…...

OpenCV 进阶实战与技巧——图像处理的全面解析

在上篇文章中&#xff0c;我们一起迈入了 Python OpenCV 的奇妙世界&#xff0c;学习了图像的读取、显示和保存等基本操作&#xff1a;用Python和OpenCV开启图像处理魔法之旅-CSDN博客。今天&#xff0c;我们将继续深入&#xff0c;探索图像的各种变换、滤波、边缘检测以及更深…...

单细胞转录组-生物标志物篇 | 从异质性描绘到筛查应用

宫颈癌&#xff08;Cervical cancer, CC&#xff09;是一种常见的妇科恶性肿瘤。尽管目前的筛查方法已被证明有效并显著降低了CC的发病率和死亡率&#xff0c;但仍然存在缺陷。单细胞RNA测序可以在单细胞分辨率下鉴定复杂和稀有的细胞群。通过scRNA-seq&#xff0c;已经绘制和描…...

MQTT:深入剖析 paho.mqtt.embedded - c - master 目录结构

引言 在嵌入式开发领域&#xff0c;消息队列遥测传输&#xff08;MQTT&#xff09;协议因其轻量级、低带宽消耗等特性被广泛应用。Eclipse Paho 项目提供了多种语言的 MQTT 客户端实现&#xff0c;其中paho.mqtt.embedded - c - master是针对 C 语言在嵌入式环境下的 MQTT 客户…...

minio命令行客户端mc常见用法

安装minio命令行客户端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安装minio命令行客户端 choco install minio-client -y# Linux安装mc客户端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 赋予可…...

Mac提示无法打开应用程序DBeaver

问题&#xff1a;安装好后&#xff0c;打开DBeaver时候提示“无法打开应用程序DBeaver” &#xff08;1&#xff09;首先&#xff0c;进入到/Applications/DBeaver.app/Contents/MacOS目录查看可执行程序的权限是否为-rwxr-xr-x&#xff0c;如果不是执行chmod x DBeaver的命令 …...

Dart逆向之函数调用

我们从Blutter恢复的部分IL中可以看到Dart调用函数的逻辑 // 0x180490: r16 <int> // 0x180490: ldr x16, [PP, #0x8a0] ; [pp0x8a0] TypeArguments: <int> // 0x180494: r30 Instance_MethodChannel // 0x180494: ldr lr, [P…...

Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决

问题描述&#xff1a; 在 Word 或者 WPS 里面&#xff0c;如果不是新的一节&#xff0c;而是位于新的一页首行时&#xff0c;不管怎么设置段前间距&#xff0c;始终是失效的&#xff0c;实际段前间距一直是零。 解决方案&#xff1a; 查询了很多方案均无法解决问题&#xff…...

在 ASP.NET Web 应用中解析 JSON 数据实例

在 ASP.NET Web 应用中解析 JSON 数据有多种方法&#xff0c;取决于你使用的是传统的 Web Forms、MVC 还是现代的 Web API。以下是几种常见的解析方法&#xff1a; 1. 使用 Newtonsoft.Json (Json.NET) 这是最常用的 JSON 处理库&#xff0c;需要先安装 NuGet 包&#xff1a;…...

vSphere 8.x Advanced Design(3V0-21.23)题库

最新版vSphere 8.x Advanced Design(3V0-21.23)题库&#xff0c;完整版见上方二维码。 Following a review of security requirements, an architect has confirmed the following requirements: REQ001- A clustered firewall solution must be placed at the perimeter of t…...

vba讲excel转换为word

VBA将excel转换为word Sub ExportToWordFormatted() 声明变量Dim ws As Worksheet 用于存储当前活动的工作表Dim rng As Range 用于存储工作表的使用范围&#xff08;即所有有数据的单元格&#xff09;Dim rowCount As Long, colCount As Long 用于存储数据范围的行数和列数…...

【BUG】远程连接阿里云服务器上的redis报错

出现 Redis Client On Error: Error: connect ECONNREFUSED 47.100.XXX.XX:6379 错误&#xff0c;表明 Redis 客户端无法连接到指定的 Redis 服务器&#xff0c;可按以下步骤排查解决&#xff1a; 1. 检查 Redis 服务器是否运行 操作&#xff1a;在 Redis 服务器所在终端执行…...

数据中台、BI业务访谈(二):组织架构梳理的坑

这是数据中台、BI业务访谈系列的第二篇文章&#xff0c;在上一篇文章中&#xff0c;我重点介绍了在给企业的业务部门、高层管理做业务访谈之前我们要做好行业、业务知识的功课。做好这些功课之后&#xff0c;就到了实际的访谈环节了。 业务访谈关键点 那么在具体业务访谈的时…...

集成学习+泰坦尼克号案例+红酒品质预测

集成学习简介 学习目标&#xff1a; 1.知道集成学习是什么&#xff1f; 2.了解集成学习的分类 3.理解bagging集成的思想 4.理解boosting集成的思想 【知道】集成学习是什么&#xff1f; 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高…...

SpringBoot 基础知识,HTTP 概述

1. 概述 1.1 Spring Spring 提供若干个子项目&#xff0c;每个项目用于完成特定功能 Spring 的若干个子项目都基于一个基础的框架&#xff1a;Spring Framework 框架类似于 房屋的地基 但 Spring Framework 配置繁琐&#xff0c;入门难度大 1.2 Spring Boot 于是&#xf…...

背包问题(java)实现

1、01背包 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scannew Scanner(System.in);int nscan.nextInt();int mscan.nextInt();int[][] dpnew int[n1][m1];int[] vnew int[n1];int[] wnew int[n1];for(int i1;i<n;i) {v…...