详解Rust标准库:BTreeMap

news2024/11/13 11:24:45

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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2237488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十八:Spring Boot 依赖(3)-- spring-boot-starter-data-jpa 依赖详解

目录 1. 理解 JPA&#xff08;Java Persistence API&#xff09; 1.1 什么是 JPA&#xff1f; 1.2 JPA 与 Hibernate 的关系 1.3 JPA 的基本注解&#xff1a;Entity, Table, Id, GeneratedValue 1.4 JPA 与数据库表的映射 2. Spring Data JPA 概述 2.1 什么是 Spring Dat…

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议&#xff0c;和HTTP类似&#xff0c;因为轻量简单&…

Pytorch实现transformer语言模型

转载自&#xff1a;| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型&#xff0c;使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…

ElasticSearch向量检索技术方案介绍

1、背景 在人工智能快速发展的今天&#xff0c;推荐技术、以文搜图、以文搜视频、以图搜图等技术已经得到了广泛的应用&#xff0c;在百度、小红书、抖音、快手等app上随便输入一段文本&#xff0c;搜索结果已不像早些年那么单一&#xff1a;只有一些文字信息&#xff0c;现在的…

算法(第一周)

一周周五&#xff0c;总结一下本周的算法学习&#xff0c;从本周开始重新学习许久未见的算法&#xff0c;当然不同于大一时使用的 C 语言以及做过的简单题&#xff0c;现在是每天一题 C 和 JavaScript&#xff08;还在学&#xff0c;目前只写了一题&#xff09; 题单是代码随想…

华为云镜像仓库基本操作

1. 登陆华为云账户,在搜索框输入"镜像容器",如下图所示: 单击 输入名称后单击确定 创建成功 2. 回到这里 单击这里 获得登陆指令 复制到你的云服务器粘贴,回车后提示"Login Succeeded"表示登陆成功. 3. 还是在"总览"这里,单击这里 跟着复制操作…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第10天,登录状态保持与退出登录

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_linkhttps://b…

MySQL系列之如何在Linux只安装客户端

导览 前言Q&#xff1a;如何安装一个Linux环境下的MySQL客户端一、准备文件1. 确认Server版本2. 选择Client安装文件 二、下载并安装1. 下载1.1 寻找文件1.2 文件说明 2. 安装2.1 上传至Linux服务器2.2 执行安装 三、连接验证1. 确认远程授权2. 建立远程连接 结语精彩回放 前言…

arcgis pro 学习笔记

二维三维集合在一起&#xff0c;与arcgis不同 一、首次使用&#xff0c;几个基本设置 1.选项——常规里面设置自动保存时间 2.新建工程文件&#xff0c;会自动加载地图&#xff0c;可以在选项里面设置为无&#xff0c;以提高启动效率。 3.设置缓存位置&#xff0c;可勾选每次…

【论文复现】MSA+抑郁症模型总结(三)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀MSA抑郁症模型 热门研究领域&#xff1a;情感计算的横向发展1. 概述2. 论文地址3. 研究背景4. 主要贡献5. 模型结构和代码6. 数据集介绍7. 性…

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…

java:使用Multi-Release Jar改造Java 1.7项目增加module-info.class以全面合规Java 9模块化规范

common-java是一个我维护了好多年的一个基础项目,编译目标为Java 1.7 现在整个团队的项目要做Java 9以上的技术迁移准备,就需要对这个在内部各项目中被广泛引用的基础项目进行改造,以适合Java 9的模块化规范。 Automatic-Module-Name Java 9的模块化规范(即Java Platform Mod…

力扣题库——75.颜色分类

这道题采用三路快速排序&#xff0c;快速排序思路看这里快速排序。将数列分为三组&#xff1a;小于基准、等于基准、大于基准。和快排一样&#xff0c;对左右递归进行快速排序。 先将题目简化&#xff0c;如果只有数字0和1&#xff0c;扫描一遍数组&#xff0c;遇到数字1不用管…

python - leetcode【数据结构-算法】-入门/通关手册

python的算法入门/通关/手册 前言&#xff1a;算法通关手册&#xff08;LeetCode&#xff09;-githubHello 算法&#xff1a;python数据结构和算法 - 中文版The Algorithms - Python最后刷题思维: python-leetcode刷题常用语法&#xff1a;变量定义&#xff1a;逻辑与或非和按位…

使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能

提示&#xff1a;CSDN 博主测评ONLYOFFICE 文章目录 引言技术栈环境准备安装 ONLYOFFICE 文档服务器获取 API 密钥安装 Flask 和 Requests 创建 Flask 应用项目结构编写 app.py创建模板 templates/index.html 运行应用功能详解文档上传生成编辑器 URL显示编辑器回调处理 安全性…

EasyUI弹出框行编辑,通过下拉框实现内容联动

EasyUI弹出框行编辑&#xff0c;通过下拉框实现内容联动 需求 实现用户支付方式配置&#xff0c;当弹出框加载出来的时候&#xff0c;显示用户现有的支付方式&#xff0c;datagrid的第一列为conbobox,下来选择之后实现后面的数据直接填充&#xff1b; 点击新增&#xff1a;新…

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…

数据结构-并查集专题(1)

一、前言 因为要开始准备年底的校赛和明年年初的ACM、蓝桥杯、天梯赛&#xff0c;于是开始按专题梳理一下对应的知识点&#xff0c;先从简单入门又值得记录的内容开始&#xff0c;并查集首当其冲。 二、我的模板 虽然说是借用了jiangly鸽鸽的板子&#xff0c;但是自己也小做…

二手交易平台测试用例设计和执行

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;追求开源思想和学无止境思想一直在提升技术的路上 &#x1f384; &#x1f308;涉及的领域有&#xff1a;Java、Python、微服务架构和分布式架构思想、基本算法编程&#x1f308; &#x1f386;喜欢的朋友可…

计算机图形学论文 | 多边形中的点可见性快速算法

&#x1f98c;&#x1f98c;&#x1f98c;读论文 &#x1f428;&#x1f428;摘要 针对点的可见性计算这一计算几何中的基础问题&#xff0c;提出一种支持任意查询点的可见多边形快速计算的基于多边形Voronoi图的点可见性算法。以与Voronoi骨架路径对应的Voronoi通道概念&…