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

C++ std::unordered_map

std::unordered_map 是 C++ STL 中无序键值对容器的核心成员,底层基于哈希表实现,存储唯一键(key)与对应值(value)的映射关系,且不保证键的顺序。其最大优势是插入、查找、删除操作的平均时间复杂度为 O(1),适合对效率敏感且无需键有序的场景。

1、底层数据结构与特性

1.1 底层数据结构与核心概念

  • 底层结构哈希表(Hash Table)。
  • 核心特性
    1. 关联性:元素是键值对,即 std::pair<const Key, T>
    2. 无序性:容器中的元素是无序的。元素的存储顺序取决于其键(Key) 的哈希值以及它们如何被映射到桶中。遍历顺序是不确定的。
    3. 唯一性:集合中每个元素的键(Key) 都是唯一的。
  • 实现原理
    • 容器维护一个桶数组(Array of Buckets)。
    • 通过一个哈希函数将元素的转换成一个哈希值。
    • 根据哈希值计算出该元素应该属于哪个(通常是 hash_value % bucket_count)。
    • 采用链地址法解决哈希冲突,即每个桶是一个链表,所有映射到同一桶的键值对都放在这个链表中。

1.2 核心特性与原理

  1. 平均常数时间复杂度 (O(1))

    • 在理想情况下,通过键进行的插入、删除和查找操作的平均时间复杂度是常数级的,即 O(1)。这是它最大的优势。
  2. 最坏情况时间复杂度 (O(n))

    • 在最坏情况下(所有元素都哈希到同一个桶),整个哈希表退化为一个链表,所有操作的时间复杂度变为 O(n)
  3. 负载因子与重哈希(Rehashing)

    • 负载因子load_factor = size() / bucket_count()
    • load_factor > max_load_factor 时,容器会自动执行重哈希(分配新桶数组,重新映射所有元素)。
    • 重哈希是一个开销很大的操作,会导致所有迭代器、指针和引用失效
  4. 键不可修改,值可修改

    • 元素的键是 const 的,一旦插入就不能修改。
    • 元素的值是非 const 的,可以随时修改。

2、操作指导与代码示例

2.1 初始化与构造函数

#include <unordered_map>
#include <string>// 1. 空unordered_map
std::unordered_map<int, std::string> umap1;// 2. 使用初始化列表 (C++11)
std::unordered_map<int, std::string> umap2 = {{1, "Alice"},{2, "Bob"},{3, "Charlie"} // 顺序是不确定的!
};// 3. 指定初始桶数量(用于性能调优)
std::unordered_map<std::string, int> umap3(100); // 创建时约有100个桶// 4. 拷贝构造函数
std::unordered_map<int, std::string> umap4(umap2);

2.2 元素访问与查找(最核心的操作)

std::unordered_map<int, std::string> m = {{1, "Apple"}, {2, "Banana"}};// --- 最常用的访问操作:operator[] ---
// 特性:如果键存在,返回对应的值的引用。
//       如果键不存在,则会插入一个具有该键的新元素,并将其值进行值初始化,然后返回这个新值的引用。
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() ---
// 对于unordered_map,返回值只能是0或1。
if (m.count(4) == 0) {std::cout << "Key 4 is not present.\n";
}// --- at():带边界检查的访问 ---
// 如果键存在,返回对应的值的引用。
// 如果键不存在,抛出 std::out_of_range 异常。
try {std::string value = m.at(5); // 键5不存在,会抛出异常
} catch (const std::out_of_range& e) {std::cout << "Key not found: " << e.what() << '\n';
}

2.3 增加元素

std::unordered_map<int, std::string> umap;// 1. insert: 插入一个pair
// 方法一:make_pair
auto ret1 = umap.insert(std::make_pair(1, "One"));
// 方法二:使用{}构造pair (C++11)
auto ret2 = umap.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 = umap.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 = umap.try_emplace(3, "Third"); // 键3已存在,不会构造"Third",ret4.second为false
auto ret5 = umap.try_emplace(4, "Four"); // 键4不存在,构造"Four",ret5.second为true// 4. operator[]: 如上所述,如果键不存在会执行插入。
umap[5] = "Five"; // 如果5不存在,则插入{5, ""},然后赋值"Five"

2.4 删除元素

std::unordered_map<int, std::string> umap = {{10, "A"}, {20, "B"}, {30, "C"}, {40, "D"}};// 1. erase by key: 删除键为30的元素,返回删除的元素个数(0或1)
size_t numErased = umap.erase(30); // numErased = 1// 2. erase by iterator: 删除指定位置的元素,更高效
auto it = umap.find(20);
if (it != umap.end()) {umap.erase(it);
}// 3. erase by range: 删除一个区间的元素 [first, last)
// (不常用,因为元素无序)
auto first = umap.find(40);
auto last = umap.end();
umap.erase(first, last); // 删除40

2.5 遍历元素

std::unordered_map<std::string, int> cityPopulations = {{"Beijing", 2154},{"Shanghai", 2424},{"Guangzhou", 1404}
};// 1. 范围for循环 + 结构化绑定 (C++17) - 最清晰,推荐!
for (const auto& [city, pop] : cityPopulations) {std::cout << city << ": " << pop << "万人\n";
}
// 输出顺序不确定// 2. 范围for循环 (C++11)
for (const auto& pair : cityPopulations) {std::cout << pair.first << ": " << pair.second << "万人\n";
}// 3. 使用迭代器
for (auto it = cityPopulations.begin(); it != cityPopulations.end(); ++it) {std::cout << it->first << ": " << it->second << "万人\n";
}

2.6 容量与性能管理(重要!)

std::unordered_map<int, std::string> umap;// 1. 预留空间:避免多次重哈希,提升性能的关键!
// 如果你事先知道要插入1000个元素,调用reserve可以避免插入过程中多次重哈希。
umap.reserve(1000); // 预留至少能容纳1000个元素的空间// 插入大量元素...
for (int i = 0; i < 1000; ++i) {umap[i] = "value";
}// 2. 查看当前状态
std::cout << "Size: " << umap.size() << "\n";
std::cout << "Bucket count: " << umap.bucket_count() << "\n"; // 桶的数量(通常是质数)
std::cout << "Load factor: " << umap.load_factor() << "\n"; // 当前负载因子
std::cout << "Max load factor: " << umap.max_load_factor() << "\n"; // 最大负载因子(默认~1.0)// 3. 手动重哈希:强制将桶数调整为至少 n
umap.rehash(2000); // 强制桶数 >= 2000// 4. 修改最大负载因子
umap.max_load_factor(0.75f); // 设置更小的最大负载因子,减少冲突概率,但增加内存使用// 5. 查看哈希表状态(调试用)
for (size_t i = 0; i < umap.bucket_count(); ++i) {std::cout << "Bucket #" << i << " has " << umap.bucket_size(i) << " elements.\n";
}

2.7 自定义类型作为键

要让自定义类型作为键,你需要提供:

  1. 哈希函数:计算键的哈希值。
  2. 相等比较函数:判断两个键是否相等。
2.7.1 特化 std::hash 并重载 operator==(推荐)**
struct Point {int x;int y;// 1. 必须重载 operator==bool operator==(const Point& other) const {return x == other.x && y == other.y;}
};// 2. 特化std::hash模板
namespace std {template<>struct hash<Point> {size_t operator()(const Point& p) const {// 使用良好的哈希组合技术size_t h1 = hash<int>()(p.x);size_t h2 = hash<int>()(p.y);return h1 ^ (h2 << 1);// 更好的方式:使用hash_combine(见下文)}};
}// 使用
std::unordered_map<Point, std::string> pointMap;
pointMap[{1, 2}] = "Origin";
2.7.2 提供自定义的哈希器和相等比较器
struct Point {int x;int y;
};// 自定义哈希器
struct PointHash {size_t operator()(const Point& p) const {return hash<int>()(p.x) ^ (hash<int>()(p.y) << 1);}
};// 自定义相等比较器
struct PointEqual {bool operator()(const Point& a, const Point& b) const {return a.x == b.x && a.y == b.y;}
};// 使用
std::unordered_map<Point, std::string, PointHash, PointEqual> pointMap;
2.7.3 更好的哈希组合方法(减少冲突)
// 一个通用的哈希组合函数(来自Boost等库的理念)
template <class T>
inline void hash_combine(std::size_t& seed, const T& v) {std::hash<T> hasher;seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}struct PointHash {size_t operator()(const Point& p) const {std::size_t seed = 0;hash_combine(seed, p.x);hash_combine(seed, p.y);return seed;}
};

3、常见问题

  1. std::unordered_map 的底层实现是什么?
    底层是哈希表。它维护一个桶数组,通过哈希函数将键映射到桶的索引,并使用链地址法解决哈希冲突。

  2. operator[]find() 方法的主要区别是什么?

  • operator[] 如果找不到键,会插入一个具有该键的新元素(值初始化),并返回其值的引用。它会改变map
  • find() 仅仅进行查找,返回一个迭代器,如果没找到则返回 end(),它不会改变map。在只读检查存在性时,应优先使用 find()
  1. 什么是重哈希?它何时发生?有什么影响?
    重哈希是哈希表扩容的过程。当当前负载因子超过最大负载因子时,容器会自动分配一个更大的新桶数组,并重新映射所有元素。重哈希会导致所有迭代器、指针和引用失效,并且是一个性能开销较大的操作。

  2. 如何让一个自定义类型可以作为 unordered_map 的键?
    需要提供两个东西:

    1. 哈希函数:通过特化 std::hash 模板或提供自定义的哈希函数对象。
    2. 相等比较函数:通过重载 operator== 或提供自定义的相等比较函数对象。
  3. 如何提高 unordered_map 的性能?

    1. 调用 reserve(n):在插入大量元素前预分配空间,避免多次重哈希。
    2. 提供高质量的哈希函数:减少哈希冲突。
    3. 调整 max_load_factor:降低最大负载因子可以减少冲突,但会增加内存使用。
  4. try_emplaceemplace 有什么区别?(C++17)
    当键已存在时,emplace 仍然会构造值对象(虽然不会插入),然后将其丢弃,这可能导致不必要的构造开销。try_emplace 在键已存在时不会构造值对象,因此对于构造开销大的值类型,try_emplace 更高效。

  5. 什么时候该用 unordered_map,什么时候该用 map
    当你需要极快的查找速度(平均O(1)),并且不关心元素的顺序时,应该选择 unordered_map。当你需要元素按键有序,或者需要进行范围查询(如找最小/最大的键),或者担心最坏情况的性能时,应该选择 map

  6. 如何避免 std::unordered_map 的 rehash 操作?
    提前用 reserve(n) 预留足够桶数(n 大于预期最大元素数),确保元素数 ≤ 最大负载因子 × 桶数,从而避免自动 rehash。例如:

unordered_map<int, int> um;
um.reserve(1000);  // 预计存储1000个元素,提前预留桶

相关文章:

C++ std::unordered_map

std::unordered_map 是 C++ STL 中无序键值对容器的核心成员,底层基于哈希表实现,存储唯一键(key)与对应值(value)的映射关系,且不保证键的顺序。其最大优势是插入、查找、删除操作的平均时间复杂度为 O(1),适合对效率敏感且无需键有序的场景。 1、底层数据结构与特性 …...

Rust mut

fn main() {// `let mut var`: mutable bindinglet mut i = 5;i = 6; // 整体替换println!("i: i32= {}", i);let mut s = String::from("Hi");s = String::from("Hello"); // 整体替换s.push_str(" World!"); // 部分修改println!(&q…...

数论与组合(模板)

gcd与exgcd inline int gcd(int a, int b) { return b == 0 : a ? gcd(b, a % b); } inline ll exgcd(ll a, ll b, ll &x, ll &y) {if (b == 0) { x = 1, y = 0; return a; }ll d = exgcd(b, a % b, x, y);ll z = x; x = y; y = z - y * (a / b);return d; }...

自动感应门的感应雷达怎么选型?

​  感应门目前在市面上用的还是比较多的,不仅能给人一种高级感同时还能够给开空调的空间起到节能的作用,广泛应用在公共营业场所比如商超酒店机场等场所。在感应门控制系统中,雷达传感器作为核心检测模块,其选型直接决定了整个感应门的响应门的速度、检测精度、抗干扰能…...

hadoop部署步骤

一、环境准备(centos7.9)点击查看代码 1、关闭防火墙 [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld2、关闭selinux [root@localhost ~]# sed -i s#SELINUX=enforcing#SELINUX=disabled#g /etc/selinux/config3、修改主机名…...

达成调用libchdb.a静态连接库中的未公开导出函数

达成调用libchdb.a静态连接库中的未公开导出函数pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

一些寄存器相关的知识

考试要求: 只需关注x86汇编语言 题目给出的某段简单程序的C语言,汇编语言,机械语言表示,能结合c语言看懂汇编语言的关键语句 汇编语言机器语言一一对应,结合汇编语言分析机器语言指令的格式,寻址方式 不会考:将c语言人工翻译成汇编语言或机器语言 ARM和MIPS不考 x86架构…...

Redis常用命令

目录启动主节点启动从节点启动哨兵节点查看主从状态查看哨兵状态方式 1:通过 redis-cli 关闭(需认证)方式 2:如果未设置密码方式 3:通过进程 ID 关闭(不推荐,可能导致数据丢失)参考资料 启动主节点 redis-server /usr/local/install/redis_sentinel/master/redis.conf …...

力扣42题 接雨水,力扣84题 柱状图中最大的矩形,力扣739题 每日温度

这三道题都是单调栈的应用 力扣739题 每日温度 使用单调栈主要有三个判断条件 1.当前遍历的元素T[i]小于栈顶元素T[st.top()]的情况 2.当前遍历的元素T[i]等于栈顶元素T[st.top()]的情况 3.当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况 要保持单调递增的栈,如果栈头元…...

使用HTTPS 服务在浏览器端启用摄像头的方式解析

使用HTTPS 服务在浏览器端启用摄像头的方式解析pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !…...

5分钟SAE极速部署Dify,高效开发AI智能体应用

自2024年 Dify.ai 开源以来,全球开发者基于其框架已构建超2.3万个智能客服、企业知识库、AI 营销助手等 AI 应用项目。Dify 通过可视化拖拽操作即可实现生产级 AI 智能体开发,显著降低了技术门槛。 然而,本地私有化部署模式常面临维护成本高、可靠性不足等问题。阿里云Serve…...

.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)

在使用MudTools.OfficeInterop.Word库进行Word文档自动化处理时,深入理解Word对象模型的核心组件是至关重要的。Word对象模型提供了一套层次化的结构,使开发者能够通过编程方式控制Word应用程序、文档以及文档内容。本章将详细介绍Word对象模型中最核心的三个对象:Applicati…...

事件轮循机制EventLoop

事件轮循机制 Event Loop(事件循环)是 JavaScript 中非常重要的概念,它是 JavaScript 执行模型的核心部分。为了理解事件循环,我们需要从 JavaScript 的单线程特性入手。 1. 单线程模型 js是单线程的, 这意味着它一次只能执行一个任务 但是现代需要处理大量异步操作(处理用…...

ruoyi-vue初步接触

因为最近参加了一个比赛,培训的时候说最终考试是要求使用ruoyi-vue来做功能,于是我在网上找到了ruoyi这个项目,准备给他搭建起来。 找了一下官网 发现了这个 准备工作然后我就开始查看本机环境java --version openjdk 21.0.8 2025-07-15 OpenJDK Runtime Environment (build…...

AT_arc180_c [ARC180C] Subsequence and Prefix Sum

考虑只让你进行一次操作,值域很小,DP。 考虑设 \(f_{i, j}\) 表示到了第 \(i\) 个数,选择的子序列和为 \(j\) 的方案数,显然只需要判断当前位置选没选即可。 如果只是这样,这个题还放不到 ARC 的 C。 发现如果 \(j = 0\),会出现一些奇怪的去重问题,就是这个时候选和不选…...

如何快速看懂「祖传项目」?Qoder 强势推出新利器

今天, Repo Wiki 正式上线新功能:支持Wiki 共享、编辑和导出。为了让知识更好地在团队中流转,Qoder 提供了 Wiki 共享能力。当用户在本地生成 Wiki 时,会自动在代码库中创建一个专属目录,只需将该目录推送至代码仓库,即可将生成的文档轻松共享给团队成员,实现协作共建。…...

测试不再碎片化:AI智能体平台「项目资料套件」功能上线!

在实际项目中,你是否遇到过这样的困扰: 项目需求被拆散在多个文档里,测试准备时要反复切换查找? 功能文档、接口文档、用户流程文档分属不同来源,整理耗时费力? 新版本发布时,常常因为文档引用不一致导致测试遗漏? 这些问题,不仅影响测试效率,更容易造成测试覆盖不完…...

大模型与知识图谱驱动测试公开课

大模型与知识图谱驱动测试公开课来啦! 内容包含: 知识图谱介绍与模型结构 图数据库选型与数据检索 文档生成知识图谱与GraphRAG 利用大模型与知识图谱生成测试用例 自动化测试用例生成 09月18日(周四)20:00,思寒老师将为分享如何利用大模型生成业务测试用例与自动化测试用…...

上位机项目展示

项目名称:装备状态多模-态视觉检测系统 (上位机平台开发) 项目简介 本项目旨在为多种先进的视觉检测算法提供一个通用、稳定且高性能的上位机平台。我独立负责该平台的设计与开发,它作为硬件控制中心和用户交互界面,无缝集成了偏振相机等多种硬件,并为外部Python算法模块提…...

美化自己的Github主页-Github profile页面仓库使用指南

GitHub 的 Profile 页面仓库 是 GitHub 在 2020 年 7 月 推出的一个小功能,官方名字叫 “Special repository for your profile”。你可以创建一个跟自己用户名完全同名的公共仓库,仓库的 README.md 内容会显示在你的个人主页顶部。而在此之前,Github的个人主页只会在左侧一…...

充气泵方案:充气泵用数字传感器有什么好处?

在充气泵应用中,数字传感器相比模拟传感器能带来多维度优势,这些优势直接匹配充气泵对精准控制、稳定运行、简化生产的核心需求,具体好处可从以下5个关键维度展开:1.气压测量更精准,避免“过充/欠充”问题充气泵的核心需求是精准控制气压(如汽车轮胎需2.2-2.5bar、自行车…...

windows系统下anaconda的安装和使用

https://blog.csdn.net/D18010492948/article/details/149262110Rust编程语言群 1036955113 java新手自学群 626070845 java/springboot/hadoop/JVM 群 4915800 Hadoop/mongodb(搭建/开发/运维)Q群481975850GOLang Q1群:6848027 GOLang Q2群:450509103 GOLang Q3群:436173132…...

Lock分析:systemstate分析row cache lock

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。Lock分析:systemstate分析row cache lock 案例是一次测试row cache lo…...

mysql查看连接数,从查询到优化

你的MySQL数据库最近是否响应变慢?很有可能是因为连接数过多导致的资源抢占!作为数据库管理员或开发者,掌握查看和监控MySQL连接数的技能至关重要,今天我们就来深入探讨这个话题。 快速查看MySQL当前连接数 最直接的命令当属show status like %connect%,这个命令可以一次性…...

遗传算法与偏最小二乘结合的化学光谱变量选择方法

一、方法原理与优势 1. 核心思想 遗传算法(GA)通过模拟自然选择的全局搜索能力,优化偏最小二乘(PLS)模型的变量选择与参数配置,解决以下问题:高维数据降维:从数万波长点中筛选关键特征 多重共线性消除:避免相邻波长点的冗余信息 模型稳定性提升:通过进化策略避免局部…...

云剪贴板

消える飛行機雲 僕たちは見送った Ki e ru hi kō ki gu mo bo ku ta chi wa mi o ku tta 眩しくて逃げた いつだって弱くて Ma bu shi ku te ni ge ta i tsu da tte yo wa ku te あの日から変わらず いつまでも変わらずに A no hi ka ra ka wa ra zu i tsu ma de mo ka wa ra …...

读书笔记:Oracle数据库的水位线秘密:为什么空表查询还很慢?

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学习《Expert Oracle Database Architecture Techniques and…...

AI测试平台自动遍历:低代码也能玩转全链路测试

在日常测试工作中,大家一定遇到过这样的情况: 功能点很多,想快速做一遍稳定性验证,却苦于用例编写耗时; 页面结构复杂,手工点来点去容易遗漏; 系统频繁迭代,每次都要重复回归,工作量翻倍。 如果能有一种方式,不用写脚本,只要提供一个入口地址或安装包,就能把系统从…...

0代码5分钟一键生成Springboot+Vue后台管理系统

0代码5分钟一键生成Springboot+Vue后台管理系统​0代码5分钟一键生成Springboot+Vue后台管理系统 1 项目概述 今天给大家介绍一款基于Spring Boot和Vue的前后端分离脚手架项目,内置高效代码生成器,可快速生成基础增删改查功能。本文将完整演示如何使用该脚手架快速构建一个商…...

nvm与node.js的安装指南

UNIX类操作系统(Linux和macOS) 安装NVM打开终端。使用curl或wget安装NVM。访问NVM的GitHub仓库页面(https://github.com/nvm-sh/nvm)以获取最新的安装脚本。例如,使用curl执行以下命令: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bas…...

故障处理:2分钟处理Oracle RAC中OCR磁盘组丢失磁盘的故障

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。故障背景 近期,为备考 Oracle ADG (Active Data Guard) 相关认证,我与…...

Saga分布式事务框架执行逻辑

Saga分布式事务框架执行逻辑 📋 目录框架概述 核心组件架构 数据库表设计 完整执行流程 节点发现与调用机制 精简补偿策略设计 总结框架概述 这是一个基于数据库驱动的Saga分布式事务框架,专门用于解决跨服务间数据同步的一致性问题。框架采用了混合编排模式,结合了集中式任…...

在Android开发中实现两个Intent跳转及数据交换的方法

在Android开发中,两个活动(Activity)之间的Intent跳转及数据交换是一项基本而重要的功能。这通常涉及两个步骤:从一个活动发送数据,并在另一个活动中接收数据。 一、发起活动 — 发送数据 首先是初始化一个Intent对象,并使用 putExtra()方法来传递数据。以下是具体的步骤…...

ARC188 做题记

训A () 题意 题解 \(\bf{record}\) B () 题意 题解 \(\bf{record}\) C () 题意 题解 \(\bf{record}\) D () 题意 题解 \(\bf{record}\) E () 题意 题解 \(\bf{record}\)...

AT_arc145_d [ARC145D] Non Arithmetic Progression Set

在这个构造题上展示出了战犯级表现。 首先你先别想和的限制,\(x - y \ne y - z\) 就已经是一个很强的限制了,先想想这个怎么做。 在我看来一个很无厘头的想法是,将 \(3\) 进制下分配数字,如果只有 \(0/1\) 必然合法,想想就会觉得很妙,但是很无厘头。 然后如何满足和的限制…...

Microsoft AI Genius | 第三集实战课正式开启:用 Copilot Studio 定制你的专属智能体

想为团队快速定制专业级 AI 智能体,却担心增加工程负担或陷入复杂流程? 我们在前两期已解锁 GitHub Copilot Agent Mode、Azure AI Foundry Agent Service(国际版)的开发秘籍,本期将带你直达智能体定制最前线——Microsoft AI Genius 2.0系列第三集实战课来了!请锁定9月2…...

C# 多线程编程核心要点:不只是Thread和lock

聊到C#多线程,很多人第一反应就是Thread和lock。没错,它们是基石,但如果你只停留在它们,那就像只会用菜刀切菜,永远做不出满汉全席。现代C#多线程的核心思想是 “高效地利用计算资源,并安全地处理并发”。下面我跟你捋几个最核心的点,保证接地气。1. 为什么要用多线程?…...

基于MATLAB的图像融合拼接GUI系统设计

一、GUI架构设计(基于App Designer) % 创建GUI组件 fig = uifigure(Name,图像融合拼接系统,Position,[100,100,800,600]);% 控件布局 btnLoad = uibutton(fig,Text,加载图像,Position,[20,500,100,30],...ButtonPushedFcn,@(btn,event) loadImageCallback());btnPreprocess =…...

Python使用多线程和异步调用

概述 在 Python 中,多线程和异步调用是处理并发任务的两种常用方式,适用于不同场景。 多线程(threading 模块) 多线程适合处理 I/O 密集型任务(如网络请求、文件读写),因为这类任务大部分时间在等待,线程可以在等待时切换到其他任务。 import threading import timedef…...

研究生学术英语读写教程(中国科学院大学出版) Unit10 TextA 原文以及翻译(仅供学习)

本文全程使用kimi助手识别原书文字并翻译,无人工校准,没有参考任何其他翻译文章,仅供学习使用,如有侵权请联系我,会及时删除。 The Doctors Dilemma: Is It Ever Good to Do Harm? 原文1 Medical knowledge changes swiftly, and technological changes make new and exp…...

基于Python+Vue开发的蛋糕商城管理系统源码+运行步骤

项目简介该项目是基于Python+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的蛋糕商城管理系统项目,大学生可以在实践中学习和…...

某运营商智慧协同平台——构建高效、敏捷的运营管理新模式

项目背景 在某运营商数字化运营战略的指引下,我司携手该运营商,共同打造智慧协同运营平台。该平台旨在实现省市协作,赋能一线,通过引入君南信息的技术和服务支持,提升业务支撑效率、加强系统安全防护、增强平台功能与服务,以满足全省21个地市独立配置、维护和管理数据展示…...

go使用反射获取http.Request参数到结构体 - 实践

go使用反射获取http.Request参数到结构体 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

基于MATLAB/Simulink的TI2000系列DSP模型设计

一、开发环境配置工具安装安装MATLAB R2023a + Simulink 安装TI C2000 Support Package(通过Add-On Explorer) 安装Code Composer Studio (CCS) v7.5+硬件连接将TI2000系列DSP开发板(如C28069)通过USB连接至PC 在CCS中完成设备驱动配置二、模型设计流程 1. 创建Simulink模型…...

nginx 常用参数

...

Python常见函数和代码示例

内置函数 print() - 输出信息到控制台 name = "Alice" age = 30 print("姓名:", name, "年龄:", age) # 输出多个值 print(f"姓名: {name}, 年龄: {age}") # 使用f-string格式化输出 print("姓名: {}, 年龄: {}".format(na…...

69-SQLite应用 - 详解

69-SQLite应用 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14…...

mysql 源码下载,从获取到安装的完整指南

你是否曾想过亲手剖析MySQL这个影响了整个互联网时代的数据库?本文将带你一步步获取MySQL源码,让你不仅能安装使用,更能深入探索其内部机制。 MySQL作为最流行的开源关系型数据库之一,其发展历程堪称传奇。从最初的免费开源到被Oracle收购,MySQL始终保持着强大的生命力。它…...

docker中centos7配置

拉取centos7镜像: docker pull centos:7 启动容器: docker run -d -it --privileged --name=test centos:7 /usr/sbin/init 进入容器: docker exec -it test /bin/sh centos7安装: #设置时区 timedatectl set-timezone Asia/Shanghai #安装crontab服务 yum install -y rsy…...

centos7虚拟机下系统环境配置

​1. 网络配置 网卡: nmcli d 网络查看: ip addr 网络配置文件: /etc/sysconfig/network-scripts/ifcfg-enoXXX BOOTPROTO=static;IPADDR=;GATEWAY=;NETMASK=255.255.255.0;ONBOOT=yes 重启网络服务: systemctl restart network.service 或:service network restart 配置D…...