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

C++ std::map

std::map 是 C++ STL 中最常用的有序键值对容器,其核心功能是存储唯一键(key)与对应值(value)的映射关系,并自动按键的顺序排序。底层基于红黑树(自平衡二叉搜索树)实现,这使得它在键的查找、插入、删除等操作上保持稳定的高效性。

1、底层数据结构与核心特性

1.1 底层数据结构

  • 底层结构:通常实现为红黑树(Red-Black Tree),一种自平衡的二叉搜索树(BST)。
  • 核心特性
    1. 关联性:元素是键值对,即 std::pair<const Key, T>。每个元素将一个键(Key) 与一个值(Value) 关联起来。
    2. 有序性:容器中的元素会根据键(Key) 按照特定的比较准则(默认为 std::less<Key>)自动进行排序。遍历时,元素总是按键的升序排列。
    3. 唯一性:集合中每个元素的键(Key) 都是唯一的。不允许存在两个键相等的元素。
  • 节点结构:红黑树的每个节点存储一个 std::pair<const Key, T> 对象。键是 const 的,以保证树的结构不被破坏,而值是可以修改的。

1.2 原理

  1. 键值对与自动排序

    • map 的所有操作都是基于键(Key) 的。
    • 排序和查找只关心键,值只是与键关联的数据。
    • 插入时,元素会根据其键的值被放到红黑树的正确位置,以维持二叉搜索树的性质。
  2. 操作效率 (O(log n))

    • 红黑树保证在最坏情况下,通过键进行的插入、删除和查找操作的时间复杂度都是对数级的,即 O(log n)
  3. 迭代器稳定性

    • 插入和删除操作不会使任何现有迭代器失效(除了指向被删除元素的迭代器)。
    • 这与 vector 的动态内存重新分配形成鲜明对比。
  4. 键不可修改,值可修改

    • 元素的键是 const 的。一旦插入,就不能再修改键,否则会破坏树的有序性。
    • 元素的值是非 const 的,可以随时修改。

2、操作指导与代码示例

2.1 初始化与构造函数

#include <map>
#include <string>// 1. 空map
std::map<int, std::string> map1;// 2. 使用初始化列表 (C++11)
std::map<int, std::string> map2 = {{1, "Alice"},{2, "Bob"},{3, "Charlie"}
};// 3. 通过迭代器范围(另一个容器的)
std::vector<std::pair<int, std::string>> vec = {{4, "David"}, {5, "Eve"}};
std::map<int, std::string> map3(vec.begin(), vec.end());// 4. 自定义比较准则(例如:按键降序)
std::map<int, std::string, std::greater<int>> map4 = {{1, "a"}, {3, "c"}, {2, "b"}};
// 遍历顺序:3->"c", 2->"b", 1->"a"// 5. 拷贝构造函数
std::map<int, std::string> map5(map2);

2.2 元素访问与查找

这是 map 最核心的操作之一

std::map<int, std::string> m = {{1, "Apple"}, {2, "Banana"}};// --- 最常用的访问操作:operator[] ---
// 如果键存在,返回对应的值的引用。
// 如果键不存在,则会插入一个具有该键的新元素,并将其值进行值初始化(对于string是空字符串""),然后返回这个新值的引用。
m[1] = "Apricot"; // 修改已存在的键值对:{1, "Apricot"}
std::cout << m[2]; // 输出: Banana
std::cout << m[3]; // 键3不存在!这会执行插入操作:m[3] = ""。现在map中有3个元素。// --- 安全的查找操作:find() ---
// 推荐在需要“只读”访问时使用find,因为它不会改变map。
auto it = m.find(2);
if (it != m.end()) { // 必须检查是否找到!std::cout << "Found: " << it->first << " -> " << it->second << "\n";it->second = "Blueberry"; // 可以修改值// it->first = 4; // 错误!键是const的,不能修改。
} else {std::cout << "Key not found.\n";
}// --- 检查存在性:count() ---
// 对于map,返回值只能是0或1。
if (m.count(4) == 0) {std::cout << "Key 4 is not present.\n";
}// --- 边界查找:lower_bound(), upper_bound(), equal_range() ---
// 用于范围查询,非常高效(O(log n))
std::map<int, std::string> numMap = {{10, "Ten"}, {20, "Twenty"}, {30, "Thirty"}};
// 找到第一个键 >= 15 的元素
auto lowIt = numMap.lower_bound(15); // 指向20->"Twenty"
// 找到第一个键 > 25 的元素
auto highIt = numMap.upper_bound(25); // 指向30->"Thirty"

2.3 增加元素

有多种方法可以向 map 中插入元素,各有优缺点。

std::map<int, std::string> m;// 1. insert: 插入一个pair
// 方法一:make_pair
auto ret1 = m.insert(std::make_pair(1, "One"));
// 方法二:使用{}构造pair (C++11)
auto ret2 = m.insert({2, "Two"});// ret 的类型是 std::pair<iterator, bool>
// ret.first: 指向被插入元素(或已存在元素)的迭代器
// ret.second: 插入是否成功(true表示成功,false表示键已存在)
if (ret2.second) {std::cout << "Insertion of key 2 succeeded.\n";
}// 2. emplace: 原地构造,避免临时对象(高效!)
// 直接传递构造键和值所需的参数给emplace
auto ret3 = m.emplace(3, "Three"); // 直接在map内部构造pair(3, "Three")
if (ret3.second) {std::cout << "Emplace succeeded.\n";
}// 3. try_emplace (C++17): 更安全高效的emplace
// 如果key不存在,则用参数构造value。
// 如果key已存在,则什么都不做,且不会构造value对象。这对于构造开销大的value类型非常关键。
auto ret4 = m.try_emplace(3, "Third"); // 键3已存在,不会构造"Third",ret4.second为false
auto ret5 = m.try_emplace(4, "Four"); // 键4不存在,构造"Four",ret5.second为true// 4. operator[]: 如上所述,如果键不存在会执行插入。
m[5] = "Five"; // 如果5不存在,则插入{5, ""},然后赋值"Five"

2.4 删除元素

std::map<int, std::string> m = {{1, "A"}, {2, "B"}, {3, "C"}, {4, "D"}, {5, "E"}};// 1. erase by key: 删除键为3的元素,返回删除的元素个数(0或1)
size_t numErased = m.erase(3); // numErased = 1// 2. erase by iterator: 删除指定位置的元素,更高效
auto it = m.find(2);
if (it != m.end()) {m.erase(it); // 删除迭代器指向的元素
}// 3. erase by range: 删除一个区间的元素 [first, last)
auto first = m.find(4);
auto last = m.end();
m.erase(first, last); // 删除4及其之后的所有元素(4和5被删除)

2.5 遍历元素

std::map<std::string, int> population = {{"Beijing", 2154},{"Shanghai", 2424},{"Guangzhou", 1404}
};// 1. 使用迭代器(总是按键有序的)
std::cout << "Using iterators:\n";
for (auto it = population.begin(); it != population.end(); ++it) {// it->first 是键(const),it->second 是值std::cout << it->first << ": " << it->second << "万人\n";
}
// 输出按城市名拼音排序:
// Beijing: 2154万人
// Guangzhou: 1404万人
// Shanghai: 2424万人// 2. 使用范围for循环 (C++11) - 最简洁
std::cout << "\nUsing range-for:\n";
for (const auto& pair : population) { // 使用const引用,避免拷贝std::cout << pair.first << ": " << pair.second << "万人\n";
}// 3. 使用结构化绑定 (C++17) - 最清晰,推荐!
std::cout << "\nUsing structured binding (C++17):\n";
for (const auto& [city, num] : population) {std::cout << city << ": " << num << "万人\n";
}// 4. 使用反向迭代器(逆序遍历)
std::cout << "\nReverse order:\n";
for (auto rit = population.rbegin(); rit != population.rend(); ++rit) {std::cout << rit->first << ": " << rit->second << "万人\n";
}

2.6 特殊成员函数与算法

map 提供了基于其有序特性的高效操作,如 lower_bound(key), upper_bound(key), equal_range(key),用于范围查询,效率为 O(log n)。

std::map<int, char> m = {{10, 'a'}, {20, 'b'}, {30, 'c'}, {40, 'd'}};// 删除所有键在 [15, 35) 范围内的元素
auto low = m.lower_bound(15); // 第一个 >=15 的元素,指向20->'b'
auto high = m.upper_bound(35); // 第一个 >35 的元素,指向40->'d'
m.erase(low, high); // 删除 [20, 30] -> 'b'和'c'被删除

2.7 自定义类型作为键

要让自定义类型(如MyClass)作为 map 的键,你需要为其定义排序准则。

2.7.1 在自定义类型内重载 operator<(推荐)
struct Point {int x;int y;// 必须定义为const成员函数// 必须定义严格的弱序(Strict Weak Ordering)bool operator<(const Point& other) const {if (x == other.x) {return y < other.y;}return x < other.x;}
};std::map<Point, std::string> pointMap;
pointMap[{1, 2}] = "First point";
pointMap[{3, 4}] = "Second point";
2.7.2 提供自定义的函数对象(仿函数)作为模板参数
struct Point {int x;int y;
};// 自定义比较器
struct PointCompare {bool operator()(const Point& a, const Point& b) const {return a.x < b.x; // 只按x坐标比较}
};// 使用时必须将比较器作为模板参数传入
std::map<Point, std::string, PointCompare> pointMap;

3、常见问题

  1. std::map 的底层实现是什么?

    • A: 底层通常是红黑树(一种自平衡二叉搜索树)。每个节点存储一个 std::pair<const Key, T> 对象。
  2. map::operator[]map::insert 的区别是什么?
    这是最关键的区别。

    • operator[] 如果键不存在,会插入一个具有该键的新元素,并将其值进行值初始化,然后返回该值的引用。它总是会改变map(如果键不存在)。
    • insert 只会尝试插入键值对。如果键已存在,则插入失败,不会改变已存在的值。它返回一个 pair<iterator, bool>,其中 bool 表示插入是否成功。
  3. 尝试修改 map 中元素的键会发生什么?
    会导致编译错误。因为键的类型是 const Key,它是不可修改的,以防止破坏红黑树的有序结构。

  4. map 的迭代器在插入和删除操作后会失效吗?
    插入操作不会使任何迭代器失效删除操作只会使指向被删除元素的迭代器失效,其他迭代器仍然有效。

  5. 如何检查一个键是否存在于 map 中?哪种方法最好?

    1. if (m.find(key) != m.end()) {...}
    2. if (m.count(key) > 0) {...} (对于map,count只能是0或1)
      最好使用 find(),因为它不仅告诉你键是否存在,还直接返回指向该元素的迭代器,方便后续操作。使用 count() 仅仅是为了检查存在性。
  6. 什么时候该用 map,什么时候该用 unordered_map
    如果需要元素按键有序,或者需要进行范围查询(如找所有大于某值的键),或者非常关心最坏情况的性能,就选择 map。如果只需要最快的平均查找、插入和删除速度,并且不关心元素的顺序,那么 unordered_map 是更好的选择。

相关文章:

C++ std::map

std::map 是 C++ STL 中最常用的有序键值对容器,其核心功能是存储唯一键(key)与对应值(value)的映射关系,并自动按键的顺序排序。底层基于红黑树(自平衡二叉搜索树)实现,这使得它在键的查找、插入、删除等操作上保持稳定的高效性。 1、底层数据结构与核心特性 1.1 底层…...

易基因:Nat Genet/IF29:董朝斌团队ChIP-seq等揭示作物株型穗型发育调控新机制 助力表观遗传育种驯化改良(顶刊佳作)

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 近日,中国农业大学玉米生物育种全国重点实验室董朝斌教授为第一及共同通讯作者,美国加州大学伯克利分校George Chuck研究员为共同通讯作者,在国际遗传学Top期刊《Nature Genetics》发表了题为“A regulator…...

Edge浏览器网页长截图

长截图步骤1.在Edge浏览器中打开目标网页(需确保网页完全加载后再截图,否则可能截取不完整)‌‌2.按下‌Ctrl+Shift+S‌组合键3.选择截屏模式‌为捕获整页‌(自动滚动并截取整个网页,生成一张长图)‌‌4.截图后可直接复制或保存为图片文件...

Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用

全文链接:https://tecdat.cn/?p=43881原文出处:拓端抖音号@拓端tecdat随着物联网(IoT)技术在电动汽车充电站(EVCS)中的普及,充电站不仅成为智能交通的关键节点,更因连接电网、用户设备与管理系统,成为网络攻击的重点目标。传统入侵检测系统(IDS)要么难以处理IoT环境…...

C++多线程编程—线程控制、同步与互斥详解

本文将深入探讨C++多线程编程中的核心概念:线程控制、同步与互斥。 1.线程控制:join 与 detach当我们创建一个线程(std::thread)后,我们必须明确在这个线程对象销毁之前,如何管理它所代表的执行线程。这就是 join 和 detach 的用武之地。join()作用:阻塞当前线程(通常是…...

MySQL启动失败:mysqld.log Permis 报错处理.250916

报错:Could not open file /var/log/mysqld.log for error logging: Permis 解决办法: sudo setenforce 0 systemctl restart mysqld systemctl status mysqld如果好了,就更改selinux策略: sudo semanage fcontext -a -t mysqld_db_t "/home/mysql/data(/.*)?" …...

源码管理—密钥硬编码问题

源码管理—密钥硬编码问题目录密钥硬编码的定义: 指在代码、配置里硬编码密码/明文密码在配置文件中,但是不论是通过 AES 加密过的密码,还是将明文密码存储在远程配置文件中,都属于硬编码密钥。 常见的密钥硬编码场景:密钥放在环境变量 密钥加密存储在代码里 密钥放在服务…...

无速度传感器交流电机的扩展Luenberger观测器

扩展Luenberger观测器是一种用于无速度传感器交流电机控制的重要技术,它能够估计电机的内部状态(如转子磁链)和转速。 理论背景 对于感应电机,在静止α-β坐标系下的模型可以表示为: 状态方程: dx/dt = A(ω)x + Bu y = Cx其中: x = [isα, isβ, ψrα, ψrβ]^T u = […...

AI Ping体验记:终于有人做大模型服务的“性能监控”了

引言 最近几个月,我们公司在开发AI应用平台并集成到现有系统中。作为项目的技术选型负责人,我被MaaS平台API的选择问题折磨得不轻。面对市面上众多的大模型服务商,如何选出最适合我们的那一个,真的是个大难题。 市面上的MaaS平台越来越多,光是国内的就有20多家,这还是我知…...

数据库原理-第二章——关系型数据库

pass...

mac 的任务栏 Windows-Style Taskbar For macOS

https://lawand.io/taskbar/...

快手Java一面

线程池七大参数和作用?有大量执行时间短的任务如何设置线程池参数? Synchronized和ReentrantLock实现上的区别?哪个能尝试获取锁?tryLock方法参数是什么?返回是什么? ReentrantLock的公平锁和非公平锁怎么实现的? JVM堆内存怎么划分的? CMS垃圾回收机制下新生代和老年代…...

详细介绍:Elastic APM 入门指南:快速设置应用性能监控

详细介绍:Elastic APM 入门指南:快速设置应用性能监控pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…...

想找Axure替代?这6个原型设计工具值得一试

引言 在原型设计工具里,Axure可以说是最为经典、老牌的一款了。它在产品圈内有着较高的知名度和地位,但随着工具生态的不断丰富,越来越多产品经理在学习和使用Axure的过程中,逐渐放弃转为寻找Axure替代工具。其实,如今想找到能替代Axure的工具并不难,本文就为大家介绍6款…...

H5游戏性能优化系列-----cpu相关优化

cpu优化主要是优化cpu使用率,帧率平稳性(卡帧,长耗时任务),主要从以下几个方面优化设置合适的帧率。根据游戏类型设置合适的帧率,比如slg,回合制这种类型游戏一般开30帧,mmo等即时战斗的或者对流畅度有很高要求的可以开60帧。 帧同步与状态同步的抉择。一般来说状态同步会…...

IPA 混淆实战 IPA 混淆、IPA 加固、ipa 文件安全与成品包防护全流程指南

本文详解 IPA 混淆实战:为何做 ipa 混淆、Ipa Guard 在成品包加固中的角色、与源码混淆的区别、工具链(MobSF、class-dump、Frida)验证流程,以及灰度发布、白名单与映射表管理等落地经验,面向开发与安全团队。在移动应用交付链中,“源码混淆”与“成品 IPA 混淆”是两条互…...

实用指南:javaweb HTML基本介绍/常见标签

实用指南:javaweb HTML基本介绍/常见标签pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !impor…...

文档处理控件Aspose.Words教程:在 C# 中将 Markdown 转换为 PDF

Markdown 被广泛用于使用纯文本语法创建格式化文本。许多开发人员喜欢用它来编写文档、注释和内容格式。然而,我们经常需要将Markdown文档生成专业的PDF文件。本文将学习如何借助Aspose.words for .NET,使用 C# 将 Markdown 转换为 PDF。Markdown 被广泛用于使用纯文本语法创…...

TCP协议与wireshark

...

docker容器mysql导入sql文件

sudo docker exec -i mysql8 mysql -u root -pSxygsj123 whpt_specialwork < /opt/sql/whpt-specialwork.sql...

ObjectSense 包与模块:代码组织的艺术

在编程世界中,随着项目规模扩大,代码的组织管理变得至关重要。ObjectSense 引入了包(Package)和模块(Module)机制,为代码的结构化管理提供了完美解决方案。 包:代码的基础组织单元 包是 ObjectSense 中最基础的代码组织形式,它通过目录结构与逻辑结构的统一,解决了命…...

IDE工具RAD Studio 13 Florence重磅发布:64 位 IDE + AI 组件全面升级!

近日,Embarcadero 正式宣布推出 RAD Studio 13 Florence,同时发布了 Delphi 13 与 C++Builder 13。这一版本带来了 全新的 64 位 RAD Studio IDE、更新的 C++Builder Clang 编译器、全新 Delphi 语言扩展、AI 组件与 AI 助手,并对现有功能进行了全面增强,重点聚焦在 质量与…...

C# 批量修改数据库

我这里有个例子,是整合数据后批次写入数据库的,只连接一次,希望对你有帮助using (SqlBulkCopy bc = new SqlBulkCopy(conn, SqlBulkCopyOptions.Default, trans)){bc.DestinationTableName = "ExamDetails";//要插入的表的表名bc.BatchSize = 10000;bc.ColumnMapp…...

Job for network.service failed because the control process exited with error code.

问题描述:VMware workstation 安装centos7启动后修改网络ip无效,报错;启动后主机还会蓝屏。 原因:windows10/11需要适配VMware workstation 16及以上,并打开虚拟配置。 解决方案:官网下载安装VMware workstation 17,17已经对个人免费。 新建虚拟机时,设置处理器》开启虚…...

负荷聚类及其在MATLAB中的实现

一、什么是负荷聚类? 负荷聚类 是指通过对用户或测量点的用电负荷数据(通常是功率随时间变化的曲线,即“负荷曲线”)进行处理和分析,根据其用电模式的相似性,自动地将它们划分为不同的类别(簇)。目标:发现数据中内在的、未知的分组模式,实现“物以类聚”。 输入:多个…...

移动安全框架(MobSF)静态分析入门指南

本文详细介绍了如何使用Mobile Security Framework(MobSF)进行移动应用静态安全分析,包含环境搭建、代码克隆、权限配置和基础扫描流程,适合移动安全入门人员学习实践。移动安全框架(MobSF)静态分析第一部分 这是一个用于分析移动应用的强大框架。在本博客中,我们将学习…...

列表项点击,逻辑梳理

列表项点击,从viewHolder >> adapter >> fragment,理清关系了。 mClickListener是传过来的,MyRecordViewHolder << MyRecordPageAdapter << MyRecordPage 最终在presenter中执行...

CRMEB标准版PHP批量发货功能深度解析

订单批量发货,批量发出当前需要发货的订单 1、导出发货单 点击批量发货—>导出发货单。注:导出发货单无需选择订单,只会导出当前待发货(不包含虚拟商品)的订单列表 2、完善发货单 导出的excel发货单中填写订单对应的快递名称,快递编码,快递单号 3、导入发货单 将填写…...

数学之美 第一章读后感

作者从人类远古时期讲起,首先指出古人传情达意的方式与如今通信方式并无差别的观点。从埃及的象形文字开始,因表意文字的增加,古人开始采用一字多意,而读者不产生歧义的话就需要联系上下文,这与解码与机器学习的原理相差不大。对于数字的发展,人类根据手指数量发明了十进…...

【SPIE出版】第九届交通工程与运输系统国际学术会议(ICTETS 2025)

第九届交通工程与运输系统国际学术会议(ICTETS 2025)将由大连理工大学主办,大连理工大学建设工程学院交通运输系承办,于2025年9月26-28日在大连隆重召开。【SPIE独立出版!连续多年EI稳定检索!】 【大连理工大学主办!】 第九届交通工程与运输系统国际学术会议(ICTETS 20…...

模型上下文协议(Model Context Protocol,MCP)

一. MCP 概述 模型上下文协议(Model Context Protocol,MCP),是由Anthropic推出的开源协议,旨在实现大语言模型与外部数据源和工具的集成,用来在大模型和数据源之间建立安全双向的连接。 模型上下文协议是专为高效获得模型所需要上下文信息而设计的通用接口,可以将推动大…...

大华设备视频平台EasyCVR视频分析设备平台双轨视频数据存储方案全解读

大华设备视频平台EasyCVR视频分析设备平台双轨视频数据存储方案全解读随着物联网、AI、云计算、大数据等新兴技术的发展、海量设备的接入、视频质量的不断提升,监控视频存储也面临着巨大的挑战。当前用户对视频监控数据的存储问题,主要考虑到以下三个因素: 1)数据的安全性和…...

AI音乐创作新突破:ACE-Step模型开启放克音乐智能生成时代

AI音乐创作新突破:ACE-Step模型开启放克音乐智能生成时代 专业级音乐创作进入AI时代 近日,Gitee AI平台正式开源其创新性音乐生成模型ACE-Step,这一技术突破将彻底改变专业音乐创作的生产方式。该模型通过深度学习算法实现了从歌词到完整编曲的端到端生成,特别在流行放克(F…...

【ABSR出版】第二届农业工程与生物学国际研讨会(ISAEB 2025)

第二届农业工程与生物学国际研讨会(ISAEB 2025)将于2025年9月26日至28日在马来西亚吉隆坡举行。【农业、生物会议 | 马来西亚国际会议】 【Scopus, CNKI, Google Scholar, Inspec (IET)检索】 第二届农业工程与生物学国际研讨会(ISAEB 2025) 2025 2nd International Symposiu…...

符号执行技术实践-求解程序密码

符号执行是什么 符号执行(Symbolic Execution)是一种程序分析技术,它使用符号值而不是具体的数值来执行程序。与传统的程序执行不同,符号执行将程序的输入用符号变量表示,然后沿着程序的执行路径收集这些符号变量必须满足的约束条件。 如果我们把普通的程序执行比作用具体的…...

博客皮肤

https://www.yuque.com/awescnb...

低轨卫星跟踪对星方式

低轨卫星跟踪对星方式 参考 https://zhuanlan.zhihu.com/p/1934304295236400209 低轨卫星的跟踪参考 https://zhuanlan.zhihu.com/p/1937283578066076622 遥测自跟踪天线低轨卫星对星的关键技术点 低轨(LEO)卫星的特点是轨道高度低(通常在200km至2000km之间),比如Starlin…...

开源中国社区发布AI赋能2.1版本:打造企业级私有化知识中枢新范式

开源中国社区发布AI赋能2.1版本:打造企业级私有化知识中枢新范式 在数字化转型浪潮席卷全球的当下,开源中国(OSCHINA.NET)正式推出社区2.1版本,以"私有化部署+AI智能引擎"为核心,重新定义企业知识管理的技术边界。这一重大升级标志着国内领先的技术社区从传统内…...

PL/SQL 性能优化指南

PL/SQL 性能优化指南 本文系统梳理了在SQL编写和PL/SQL程序设计中常见的性能问题,并提供可落地的优化策略,帮助开发者写出更高效、更稳定的数据库代码。一、表连接与解析顺序优化 1. 选择最优的表名顺序(适用于RBO,现代已不敏感但建议保留习惯) Oracle在基于规则的优化器(…...

jdbcType-java 类型

在 JDBC 中,jdbcType 用于指定数据库字段的数据类型,确保 Java 类型与数据库类型正确映射。MyBatis 等持久层框架常使用 jdbcType 处理参数和结果集的类型转换。以下是常见的 jdbcType 类型及其说明:JDBC 类型对应 Java 类型说明常见数据库映射示例ARRAY java.sql.Array 数据…...

支配对

本质思路是,通过可接受复杂度个支配对来表示所有点对。找支配对的核心条件是,在任何情况下其他点对都会被支配对淘汰。找支配对往往有两个限制,一是值是否更优,二是是否更容易满足限制。这相当于一个二维偏序问题,只不过我们要自己找偏序的对象。 在序列上,一般是区间问题…...

macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载

macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载macOS Sonoma 14.8 (23J21) 正式版 ISO、IPSW、PKG 下载 利用小组件进行个性化设置、令人眼前一亮的全新屏幕保护、Safari 浏览器和视频会议的重大更新 请访问原文链接:https://sysin.org/blog/macOS-Sonoma/ 查看最新版…...

DamiBus v1.1.0 发布(给单体多模块解耦)

DamiBus是一款专为单体多模块通讯解耦设计的工具,结合了Bus与RPC的特点,支持事件分发和接口调用。新版本简化了API,弃用了部分方法并新增了更直观的调用方式。其特点包括事务传导、事件标识、监听者排序等,与EventBus和Api相比耦合度更低。性能测试显示处理千万级事件仅需1…...

最小环 Floyd 算法 无向图的最小环问题

P6175 无向图的最小环问题 - 洛谷 k次插点前更新 ans=min(d[i][j]+w[j][k]+w[k][i]) 注意 i,j下边循环范围小于k // Floyd 最小环 O(n^3) #include<bits/stdc++.h> using namespace std;const int N=110; int n,m,a,b,c,ans=1e8; int w[N][N],d[N][N];int main(){cin>…...

macOS Sequoia 15.7 (24G222) Boot ISO 原版可引导镜像下载

macOS Sequoia 15.7 (24G222) Boot ISO 原版可引导镜像下载macOS Sequoia 15.7 (24G222) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https://sysin.org/blog/macOS-Sequoia-…...

Nginx 安装过程

一、安装 1、安装依赖 命令:yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 若出错,可重复执行该命令,直至成功。 在Debian及其衍生系统中使用命令:sudo apt install -y g++ libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl libssl-dev …...

Xcode 26 (17A324) 正式版发布 - Apple 平台 IDE

Xcode 26 (17A324) 正式版发布 - Apple 平台 IDEXcode 26 (17A324) 正式版发布 - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接:https://sysin.org/blog/apple-xcode-26/ 查看最新版。原创作品,转载请保留出处。 作者主页:sysin.orgXcode …...

macOS Tahoe 26 (25A354) Boot ISO 原版可引导镜像下载

macOS Tahoe 26 (25A354) Boot ISO 原版可引导镜像下载macOS Tahoe 26 (25A354) Boot ISO 原版可引导镜像下载 Liquid Glass 惊艳新设计亮相,电话 app 和实时活动丰富连续互通体验,聚焦搜索迎来最大更新 请访问原文链接:https://sysin.org/blog/macos-tahoe-boot-iso/ 查看最…...

mysql数据库服务主从复制实现(基于position)

复制环境搭建 1.1 备份主库信息# mysqldump https://www.cnblogs.com/lifeiLinux/p/19066160 # pxb https://www.cnblogs.com/lifeiLinux/p/19066181 # 克隆 https://www.cnblogs.com/lifeiLinux/p/190942511.2 主数据库二进制日志功能开启 vim /etc/my.cnf server_id=51 log_b…...

海量接入、毫秒响应:易易互联携手阿里云构筑高可用物联网消息中枢

面对换电生态高速发展的通信挑战,易易互联通过采用阿里云 MQTT + RocketMQ 的融合解决方案,成功构建了“海量接入、实时响应、弹性处理、安全可信”的物联网通信底座。作者:横槊、仁中 易易互联:打造安全、便捷、便宜的智能换电网络 易易互联科技有限公司成立于 2017 年,是…...