详解Rust标准库:BTreeMap
std::collections::BTreeMap定义
B树也称B-树,注意不是减号,是一棵多路平衡查找树;理论上,二叉搜索树 (BST) 是最佳的选择排序映射,但是每次查找时层数越多I/O次数越多,B 树使每个节点都包含连续数组中的 B-1 到 2B-1 元素,可以减少树的高度,减少I/O次数
BTreeMap定义
pub struct BTreeMap<K, V, A: Allocator + Clone = Global> {// B 树的根节点root: Option<Root<K, V>>,// B 树映射中存储的键值对的数量length: usize,// 分配器pub(super) alloc: ManuallyDrop<A>,// PhantomData是一个零大小的类型,用于向编译器提供类型信息,但在运行时不占用任何空间_marker: PhantomData<crate::boxed::Box<(K, V), A>>,
}
方法
clear:用于清空BTreeMap,移除所有的键值对
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::new();map.insert("a", 1);map.insert("b", 2);map.clear();println!("After clear, is empty? {}", map.is_empty());// After clear, is empty? true
}
get:用于获取指定键对应的值的不可变引用,如果键不存在则返回None
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);if let Some(value) = map.get("a") {println!("Value for 'a': {}", value);// Value for 'a': 1} else {println!("'a' not found.");}
}
get_key_value:返回指定键对应的值和键的不可变引用,如果键不存在则返回None
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);if let Some((key, value)) = map.get_key_value("b") {println!("Key-value pair for 'b': {} -> {}", key, value);// Key-value pair for 'b': b -> 2} else {println!("'b' not found.");}
}
first_key_value:返回BTreeMap中的第一个键值对,如果地图为空则返回None
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);if let Some((first_key, first_value)) = map.first_key_value() {println!("First key-value pair: {} -> {}", first_key, first_value);// First key-value pair: a -> 1} else {println!("Map is empty.");}
}
first_entry:返回一个可变引用到BTreeMap中的第一个键值对,如果地图为空则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some(first_entry) = map.first_entry() {println!("First entry: {} -> {}", first_entry.key(), first_entry.get());// First entry: a -> 1} else {println!("Map is empty.");}
}
pop_first:移除并返回BTreeMap中的第一个键值对,如果地图为空则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some((popped_key, popped_value)) = map.pop_first() {println!("Popped first pair: {} -> {}", popped_key, popped_value);// Popped first pair: a -> 1} else {println!("Map is empty.");}
}
pop_last:移除并返回BTreeMap中的最后一个键值对,如果地图为空则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some((last_key, last_value)) = map.pop_last() {println!("Popped last pair: {} -> {}", last_key, last_value);// Popped last pair: b -> 2} else {println!("Map is empty.");}
}
contains_key:判断BTreeMap中是否存在指定的键
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);println!("Contains 'a'? {}", map.contains_key("a"));// Contains 'a'? true
}
get_mut:返回指定键对应的值的可变引用,如果键不存在则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some(value) = map.get_mut("a") {*value = 3;println!("Modified value for 'a': {}", value);// Modified value for 'a': 3} else {println!("'a' not found.");}
}
insert:插入一个键值对到BTreeMap中,如果键已经存在,则覆盖旧值
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::new();map.insert("a", 1);map.insert("a", 2);println!("After insert: {:?}", map);// After insert: {"a": 2}
}
remove:移除指定键对应的键值对,并返回被移除的值,如果键不存在则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some(removed_value) = map.remove("a") {println!("Removed value for 'a': {}", removed_value);// Removed value for 'a': 1} else {println!("'a' not found.");}
}
remove_entry:移除指定键对应的键值对,并返回被移除的键值对,如果键不存在则返回None
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);if let Some((removed_key, removed_value)) = map.remove_entry("b") {println!("Removed entry: {} -> {}", removed_key, removed_value);// Removed entry: b -> 2} else {println!("'b' not found.");}
}
retain:保留满足给定谓词的键值对
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),("c", 3),]);map.retain(|key, value| (*key > "b" || *value >= 2));println!("After retain: {:?}", map);// After retain: {"b": 2, "c": 3}
}
append:将另一个BTreeMap的键值对追加到当前BTreeMap中
use std::collections::BTreeMap;fn main() {let mut map1 = BTreeMap::from([("a", 1),("b", 2),]);let mut map2 = BTreeMap::from([("c", 3),("d", 4),]);map1.append(&mut map2);println!("After append: {:?}", map1);// After append: {"a": 1, "b": 2, "c": 3, "d": 4}
}
range:返回一个迭代器,遍历BTreeMap中满足给定范围条件的键值对
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),("c", 3),("d", 4),]);for (key, value) in map.range("b"..) {println!("In range: {} -> {}", key, value);}// In range: b -> 2// In range: c -> 3// In range: d -> 4
}
range_mut:返回一个可变迭代器,遍历BTreeMap中满足给定范围条件的键值对,并允许修改值
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),("c", 3),("d", 4),]);for (key, value) in map.range_mut("b"..) {*value = *value * 2;println!("Modified in range: {} -> {}", key, value);}// Modified in range: b -> 4// Modified in range: c -> 6// Modified in range: d -> 8
}
entry:返回一个Entry API,可以用于插入或更新键值对
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::new();let entry = map.entry("a").or_insert(1);println!("Entry value for 'a': {}", entry);// Entry value for 'a': 1
}
split_off:移除并返回给定键及其对应的值,如果键不存在则返回None和一个空BTreeMap
into_keys:将BTreeMap的键提取为一个可迭代的集合
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);let keys: Vec<_> = map.into_keys().collect();println!("Keys: {:?}", keys);// Keys: ["a", "b"]
}
into_values:将BTreeMap的值提取为一个可迭代的集合
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);let values: Vec<_> = map.into_values().collect();println!("Values: {:?}", values);// Values: [1, 2]
}
iter:返回一个迭代器,遍历BTreeMap的键值对
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);for (key, value) in map.iter() {println!("Iter: {} -> {}", key, value);}// Iter: a -> 1// Iter: b -> 2
}
iter_mut:返回一个可变迭代器,允许修改BTreeMap的键值对
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);for (key, value) in map.iter_mut() {*value = *value * 2;println!("Mut iter: {} -> {}", key, value);}// Mut iter: a -> 2// Mut iter: b -> 4
}
keys:返回一个迭代器,遍历BTreeMap的键
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);for key in map.keys() {println!("Key from keys: {}", key);}// Key from keys: a// Key from keys: b
}
values:返回一个迭代器,遍历BTreeMap的值
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);for value in map.values() {println!("Value from values: {}", value);}// Value from values: 1// Value from values: 2
}
values_mut:返回一个可变迭代器,允许修改BTreeMap的值
use std::collections::BTreeMap;fn main() {let mut map = BTreeMap::from([("a", 1),("b", 2),]);for value in map.values_mut() {*value = *value * 3;println!("Mut value from values_mut: {}", value);}// Mut value from values_mut: 3// Mut value from values_mut: 6
}
len:返回BTreeMap中键值对的数量
use std::collections::BTreeMap;fn main() {let map = BTreeMap::from([("a", 1),("b", 2),]);println!("Length: {}", map.len());// Length: 2
}
is_empty:判断BTreeMap是否为空
use std::collections::BTreeMap;fn main() {let map: BTreeMap<i32, &str> = BTreeMap::new();println!("Is empty: {}", map.is_empty());// Is empty: true
}
相关文章:
详解Rust标准库:BTreeMap
std::collections::BTreeMap定义 B树也称B-树,注意不是减号,是一棵多路平衡查找树;理论上,二叉搜索树 (BST) 是最佳的选择排序映射,但是每次查找时层数越多I/O次数越多,B 树使每个节…...
.NET WPF CommunityToolkit.Mvvm框架
文章目录 .NET WPF CommunityToolkit.Mvvm框架1 源生成器1.1 ObservablePropertyAttribute & RelayCommandAttribute1.2 INotifyPropertyChangedAttribute 2 可观测对象2.1 ObservableValidator2.2 ObservableRecipient .NET WPF CommunityToolkit.Mvvm框架 1 源生成器 1…...
微信小程序使用阿里巴巴矢量图标库正确姿势
1、打开官网:https://www.iconfont.cn/,把整理好的图标下载解压。 2、由于微信小程序不支持直接在wxss中引入.ttf/.woff/.woff2(在开发工具生效,手机不生效)。我们需要对下载的文件进一步处理。 eot:IE系列…...
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
在 Kubernetes 中,NodePort 类型的 Service 允许用户通过每个节点的 IP 地址和指定的端口访问应用程序。如果 NodePort 类型的 Service 无法通过节点的 IP 地址和指定端口进行访问,可能会导致用户无法访问应用。本文将详细分析该问题的常见原因及其解决方…...
Java基础Day-Thirteen
Java字符串 String类 创建String对象的方法 方法一:创建一个字符串对象imooc,名为s1 String s1"imooc"; 方法二:创建一个空字符串对象,名为s2 String s2new String(); 方法三:创建一个字符串对象imooc&a…...
LangChain实际应用
1、LangChain与RAG检索增强生成技术 LangChain是个开源框架,可以将大语言模型与本地数据源相结合,该框架目前以Python或JavaScript包的形式提供; 大语言模型:可以是GPT-4或HuggingFace的模型;本地数据源:…...
【数据结构】哈希/散列表
目录 一、哈希表的概念二、哈希冲突2.1 冲突概念2.2 冲突避免2.2.1 方式一哈希函数设计2.2.2 方式二负载因子调节 2.3 冲突解决2.3.1 闭散列2.3.2 开散列(哈希桶) 2.4 性能分析 三、实现简单hash桶3.1 内部类与成员变量3.2 插入3.3 获取value值3.4 总代码…...
flutter 项目初建碰到的控制台报错无法启动问题
在第一次运行flutter时,会碰见一直卡在Runing Gradle task assembleDebug的问题。其实出现这个问题的原因有两个。 一:如果你flutter -doctor 检测都很ok,而且环境配置都很正确,那么大概率就是需要多等一会,少则几十分…...
Java字符串深度解析:String的实现、常量池与性能优化
引言 在Java编程中,字符串操作是最常见的任务之一。String 类在 Java 中有着独特的实现和特性,理解其背后的原理对于编写高效、安全的代码至关重要。本文将深入探讨 String 的实现机制、字符串常量池、不可变性的优点,以及 String、StringBu…...
leetcode 2043.简易银行系统
1.题目要求: 示例: 输入: ["Bank", "withdraw", "transfer", "deposit", "transfer", "withdraw"] [[[10, 100, 20, 50, 30]], [3, 10], [5, 1, 20], [5, 20], [3, 4, 15], [10, 50]] 输出ÿ…...
基于SSM(Spring + Spring MVC + MyBatis)框架的文物管理系统
基于SSM(Spring Spring MVC MyBatis)框架的文物管理系统是一个综合性的Web应用程序,用于管理和保护文物资源。下面我将提供一个详细的案例程序概述,包括主要的功能模块和技术栈介绍。 项目概述 功能需求 用户管理:…...
yakit中的规则详细解释
官方文档 序列前置知识之高级配置 | Yak Program Language 本文章多以编写yaml模版的视角来解释 规则一览 匹配器 在编写yaml中会使用到这里两个东西 点击添加会在返回包的右下角出现匹配器 上面有三个过滤器模式,官方解释 丢弃:丢弃模式会在符合匹配…...
[c语言]strcmp函数的使用和模拟实现
1.strcmp函数的使用 int strcmp ( const char * str1, const char * str2 ); 如果 str1 小于 str2,返回一个负值。如果 str1 等于 str2,返回 0。如果 str1 大于 str2,返回一个正值。 实例: #include <stdio.h> #include &…...
如何把子组件的v-model修改数据,进行接收然后定义数据格式,子传父的实现
在 Vue 中,实现子组件通过 v-model 向父组件传递数据并接收后进行格式化,可以按照以下步骤来封装和实现: 步骤 1: 子组件实现 v-model 子组件需要定义一个 props 来接收 v-model 的值,并通过 emit 方法发出更新事件。 <!-- …...
linux dpkg 查看 安装 卸载 .deb
1、安装 sudo dpkg -i google-chrome-stable.deb # 如果您在安装过程中或安装和启动程序后遇到任何依赖项错误, # 您可以使用以下apt 命令使用-f标志解析和安装依赖项,该标志告诉程序修复损坏的依赖项。 # -y 表示自动回答“yes”,在安装…...
【算法】递归+深搜:105.从前序与中序遍历序列构造二叉树
目录 1、题目链接 2、题目介绍 3、解法 函数头-----找出重复子问题 函数体---解决子问题 4、代码 1、题目链接 105.从前序与中序遍历序列构造二叉树. - 力扣(LeetCode) 2、题目介绍 3、解法 前序遍历性质: 节点按照 [ 根节点 …...
ESP32 gptimer通用定时器初始化报错:assert failed: timer_ll_set_clock_prescale
背景:IDF版本V5.1.2 ,配置ESP32 通用定时器,实现100HZ,占空比50% 的PWM波形。 根据乐鑫官方的IDF指导文档设置内部计数器的分辨率,计数器每滴答一次相当于 1 / resolution_hz 秒。 (ESP-IDF编程指导文档&a…...
基于Python的旅游景点推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【开源社区】ELK 磁盘异常占用解决及优化实践
1、问题及场景描述 本文主要讨论在 CentOS环境下基于 rpm 包部署 ELK 系统磁盘异常占用的问题解析和解决方案。 生产问题描述:以下问题现实场景基于ELK体系下,ES服务的磁盘占用问题解析。默认情况下,基于 RPM 安装的 Elasticsearch 服务的安…...
达梦数据守护集群_动态增加实时备库
目录 1、概述 2、实验环境 2.1环境信息 2.2配置信息 2.3 查看初始化参数 3、动态增加实时备库 3.1数据准备 3.2配置新备库 3.3动态增加MAL配置 3.4 关闭守护进程及监视器 3.5修改归档(方法1:动态添加归档配置) 3.6 修改归档&…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
