Rust面试题及详细答案120道(58-65)-- 集合类型

前后端面试题》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。

前后端面试题-专栏总目录

在这里插入图片描述

文章目录

  • 一、本文面试题目录
      • 58. 简述Rust标准库中的主要集合类型(`Vec`、`String`、`HashMap`等)
      • 59. `Vec<T>`的基本操作(创建、添加、删除、访问元素),如何避免越界访问?
        • 基本操作示例:
        • 避免越界访问的方法:
      • 60. `String`与`&str`的关系,`String`的内部结构是什么(提示:`Vec<u8>`)?
        • `String`与`&str`的关系:
        • `String`的内部结构:
      • 61. 如何处理UTF-8编码的字符串?为什么`String`不能直接通过索引访问字符?
        • 处理UTF-8编码的字符串:
        • 为什么`String`不能直接通过索引访问字符?
      • 62. `HashMap<K, V>`的使用场景,如何插入、查询、删除键值对?
        • `HashMap<K, V>`的使用场景:
        • 基本操作示例:
        • 其他常用操作:
      • 63. `BTreeMap`与`HashMap`的区别,何时选择`BTreeMap`?
        • `BTreeMap`与`HashMap`的区别:
        • 何时选择`BTreeMap`?
      • 64. `HashSet`和`BTreeSet`的特点,如何判断元素是否存在?
        • `HashSet<T>`的特点:
        • `BTreeSet<T>`的特点:
        • 判断元素是否存在的方法:
      • 65. 什么是“切片(Slice)”?`&[T]`和`&str`的关系是什么?
        • 切片(Slice)的定义:
        • 切片的特点:
        • `&[T]`和`&str`的关系:
  • 二、120道Rust面试题目录列表

一、本文面试题目录

58. 简述Rust标准库中的主要集合类型(VecStringHashMap等)

Rust标准库提供了多种集合类型,用于存储和管理数据集合,它们都在堆上分配内存,且具有不同的特性和适用场景。主要集合类型包括:

  • Vec<T>(动态数组)

    • 原理:连续存储相同类型T的元素,支持动态扩容,内部基于Vec<u8>实现。
    • 特点:随机访问效率高(O(1)),适合存储有序、可重复的元素。
  • String(字符串)

    • 原理:UTF-8编码的可变字符串,内部本质是Vec<u8>,但保证数据符合UTF-8标准。
    • 特点:支持字符串拼接、修改,适合处理文本数据。
  • HashMap<K, V>(哈希表)

    • 原理:基于哈希函数存储键值对(K为键,V为值),通过键快速查找值。
    • 特点:插入和查询效率高(平均O(1)),但元素无序,K需实现HashEq trait。
  • BTreeMap<K, V>(有序映射)

    • 原理:基于B树实现的键值对集合,元素按键的顺序排序。
    • 特点:支持范围查询,插入和查询效率为O(log n),K需实现Ord trait。
  • HashSet<T>(哈希集合)

    • 原理:基于HashMap实现,仅存储键(值为单元类型()),确保元素唯一。
    • 特点:判断元素是否存在效率高(平均O(1)),T需实现HashEq trait。
  • BTreeSet<T>(有序集合)

    • 原理:基于BTreeMap实现,元素唯一且按顺序存储。
    • 特点:支持范围查询和排序,T需实现Ord trait。
  • LinkedList<T>(双向链表)

    • 原理:节点通过指针连接的双向链表,不连续存储。
    • 特点:插入和删除首尾元素效率高(O(1)),但随机访问效率低(O(n)),一般不推荐优先使用。

59. Vec<T>的基本操作(创建、添加、删除、访问元素),如何避免越界访问?

Vec<T>是Rust中最常用的动态数组类型,支持多种操作,同时需注意避免越界访问以保证安全性。

基本操作示例:
fn main() {// 1. 创建Veclet mut v1: Vec<i32> = Vec::new(); // 空Veclet v2 = vec![1, 2, 3]; // 使用vec!宏初始化let v3 = (0..5).collect::<Vec<i32>>(); // 从迭代器收集// 2. 添加元素(push/apppend)v1.push(4);v1.push(5);let mut v4 = vec![6, 7];v1.append(&mut v4); // 合并v4到v1(v4会被清空)println!("v1: {:?}", v1); // [4, 5, 6, 7]// 3. 访问元素let third = &v2[2]; // 索引访问(越界会panic)println!("v2[2]: {}", third); // 3let opt = v2.get(1); // get方法(返回Option<&T>,越界返回None)if let Some(val) = opt {println!("v2[1]: {}", val); // 2}// 4. 删除元素let last = v1.pop(); // 移除最后一个元素(返回Option<T>)println!("pop: {:?}", last); // Some(7)v1.remove(0); // 移除索引0的元素(返回被移除的值)println!("v1 after remove: {:?}", v1); // [5, 6]
}
避免越界访问的方法:
  1. 使用get方法:返回Option<&T>,越界时返回None,可通过if letmatch安全处理。
  2. 检查长度:通过v.len()判断索引是否在有效范围内(0 <= index < v.len())。
  3. 迭代器访问:使用for item in &v遍历元素,无需手动管理索引。
  4. 模式匹配:结合Vecis_empty方法和范围判断,避免访问空数组。

60. String&str的关系,String的内部结构是什么(提示:Vec<u8>)?

String&str的关系:
  • String:是一个可变的、拥有所有权的UTF-8字符串,数据存储在堆上,支持修改(如拼接、插入等)。
  • &str:是一个不可变的字符串切片&[u8]的特化),指向String或静态字符串(&'static str)中的一段连续UTF-8数据,不拥有所有权。
  • 关系:String可以通过&s(或s.as_str())转换为&str,而&str可以通过to_string()String::from()转换为String(会复制数据)。
String的内部结构:

String本质上是对Vec<u8>的封装,其内部结构包含三部分(与Vec一致):

  • 指针:指向堆上存储的UTF-8字节数据。
  • 长度:当前字符串的字节数(len()方法返回)。
  • 容量:堆上分配的总字节数(capacity()方法返回,大于等于长度)。

示例:

fn main() {let s = String::from("hello");// String -> &strlet slice: &str = &s;println!("slice: {}", slice); // hello// &str -> Stringlet s2 = slice.to_string();println!("s2: {}", s2); // hello// 查看String的内部字节(UTF-8编码)let bytes = s.as_bytes(); // &[u8]println!("bytes: {:?}", bytes); // [104, 101, 108, 108, 111](对应"hello"的ASCII码)
}

61. 如何处理UTF-8编码的字符串?为什么String不能直接通过索引访问字符?

处理UTF-8编码的字符串:

UTF-8是一种可变长度的Unicode编码(1-4字节表示一个字符),Rust的String&str均采用UTF-8编码。常见处理方式包括:

  1. 迭代字符:使用chars()方法获取字符迭代器(每个元素是char类型)。
  2. 按字节处理:使用as_bytes()获取字节切片(&[u8]),适合处理原始字节。
  3. 获取子串:使用get()split_at()方法,需确保分割点在UTF-8字符边界上。

示例:

fn main() {let s = String::from("你好,world");// 迭代字符(char)for c in s.chars() {print!("{} ", c); // 你 好 , w o r l d }println!();// 按字节处理(注意:中文字符占3字节)let bytes = s.as_bytes();println!("bytes: {:?}", bytes); // [228, 189, 160, 229, 165, 189, ...]// 安全获取子串(从索引0到6,对应"你好")if let Some(sub) = s.get(0..6) {println!("sub: {}", sub); // 你好}
}
为什么String不能直接通过索引访问字符?
  • UTF-8的可变长度特性:一个char可能占1-4字节(如英文字母1字节,中文3字节),索引访问的是字节位置,而非字符位置,可能导致获取到不完整的字符(如半个中文字符)。
  • 安全性设计:Rust为避免无效的UTF-8数据访问,禁止直接通过索引访问String的字符,强制使用chars()get()等安全方法。

62. HashMap<K, V>的使用场景,如何插入、查询、删除键值对?

HashMap<K, V>的使用场景:
  • 需通过唯一键快速查询值(如字典、缓存、用户ID与信息映射)。
  • 元素无序且对排序无要求。
  • 插入和查询操作频繁,且希望平均时间复杂度为O(1)。
基本操作示例:
use std::collections::HashMap;fn main() {// 创建HashMaplet mut map: HashMap<&str, i32> = HashMap::new();// 1. 插入键值对(insert返回旧值的Option)map.insert("one", 1);let old_val = map.insert("one", 100); // 覆盖旧值"one"println!("old_val: {:?}", old_val); // Some(1)// 2. 查询值(get返回Option<&V>)let val = map.get("one");if let Some(v) = val {println!("one: {}", v); // 100}// 3. 检查键是否存在if map.contains_key("two") {println!("two exists");} else {println!("two not exists"); // 执行此分支}// 4. 删除键值对(remove返回被删除值的Option)let removed = map.remove("one");println!("removed: {:?}", removed); // Some(100)println!("map after remove: {:?}", map); // {}
}
其他常用操作:
  • 遍历for (k, v) in &map 遍历键值对。
  • 更新值entry API(如map.entry("key").or_insert(0),不存在则插入默认值)。

63. BTreeMapHashMap的区别,何时选择BTreeMap

BTreeMapHashMap的区别:
特性HashMap<K, V>BTreeMap<K, V>
内部实现哈希表B树(有序数据结构)
元素顺序无序按键的Ord trait排序
插入/查询复杂度平均O(1),最坏O(n)O(log n)
键的约束K: Hash + EqK: Ord
范围查询支持不支持支持(如range(a..b)
内存占用较高(哈希表需预留空间)较低(B树结构紧凑)
何时选择BTreeMap
  1. 需要元素按键排序(如排行榜、字典序输出)。
  2. 需要范围查询(如查找键在[a, b]之间的所有元素)。
  3. 键类型实现Ord但不实现Hash(如自定义类型未实现Hash)。
  4. 对内存占用较敏感,且插入/查询频率适中(O(log n)可接受)。

示例(BTreeMap范围查询):

use std::collections::BTreeMap;fn main() {let mut btree_map = BTreeMap::new();btree_map.insert(3, "three");btree_map.insert(1, "one");btree_map.insert(2, "two");// 自动按键排序println!("btree_map: {:?}", btree_map); // {1: "one", 2: "two", 3: "three"}// 范围查询(键1到2)let range = btree_map.range(1..=2);for (k, v) in range {println!("{}: {}", k, v); // 1: one, 2: two}
}

64. HashSetBTreeSet的特点,如何判断元素是否存在?

HashSet<T>的特点:
  • 基于HashMap<T, ()>实现,存储唯一元素(无键值对,仅值)。
  • 元素无序,T需实现Hash + Eq trait。
  • 插入、删除、判断存在的平均复杂度为O(1)。
  • 适合快速去重和存在性检查,对顺序无要求。
BTreeSet<T>的特点:
  • 基于BTreeMap<T, ()>实现,元素唯一且按Ord trait排序。
  • T需实现Ord trait。
  • 插入、删除、判断存在的复杂度为O(log n)。
  • 支持范围查询和有序遍历,适合需要排序或范围操作的场景。
判断元素是否存在的方法:

两种集合均通过contains方法判断元素是否存在,返回bool

示例:

use std::collections::{HashSet, BTreeSet};fn main() {// HashSetlet mut hash_set = HashSet::new();hash_set.insert("apple");hash_set.insert("banana");println!("HashSet has 'apple'? {}", hash_set.contains("apple")); // true// BTreeSetlet mut btree_set = BTreeSet::new();btree_set.insert(3);btree_set.insert(1);btree_set.insert(2);println!("BTreeSet has 2? {}", btree_set.contains(&2)); // trueprintln!("BTreeSet elements: {:?}", btree_set); // {1, 2, 3}(有序)
}

65. 什么是“切片(Slice)”?&[T]&str的关系是什么?

切片(Slice)的定义:

切片是一种不拥有所有权的引用类型,用于指向集合中一段连续的元素,格式为&[T](泛型切片)或&str(字符串切片)。它不存储数据,仅包含指针(指向数据起始位置)和长度(元素数量),因此长度在编译时不确定,但访问时会检查边界以避免越界。

切片的特点:
  • 不可变切片(&[T]):不能修改指向的元素。
  • 可变切片(&mut [T]):可以修改指向的元素,但需遵守借用规则(同一时间只能有一个可变引用)。
  • 常用于安全访问集合的部分数据,无需复制整个集合。
&[T]&str的关系:
  • &str&[u8]特化版本,专门用于表示UTF-8编码的字符串切片,保证数据符合UTF-8标准。
  • &[T]是通用的切片类型,可指向任何连续存储的同类型元素(如Vec<T>、数组[T; N])。
  • 两者均为切片,结构相同(指针+长度),但&str有额外的UTF-8有效性约束。

示例:

fn main() {// 数组切片(&[T])let arr = [1, 2, 3, 4, 5];let slice: &[i32] = &arr[1..4]; // 指向arr的索引1到3(元素2,3,4)println!("array slice: {:?}", slice); // [2, 3, 4]// 字符串切片(&str)let s = String::from("hello world");let str_slice: &str = &s[0..5]; // 指向"hello"println!("string slice: {}", str_slice); // hello// &str本质是&[u8]的特化(但保证UTF-8)let bytes: &[u8] = str_slice.as_bytes();println!("bytes: {:?}", bytes); // [104, 101, 108, 108, 111]
}

二、120道Rust面试题目录列表

文章序号Rust面试题120道
1Rust面试题及详细答案120道(01-10)
2Rust面试题及详细答案120道(11-18)
3Rust面试题及详细答案120道(19-26)
4Rust面试题及详细答案120道(27-32)
5Rust面试题及详细答案120道(33-41)
6Rust面试题及详细答案120道(42-50)
7Rust面试题及详细答案120道(51-57)
8Rust面试题及详细答案120道(58-65)
9Rust面试题及详细答案120道(66-71)
10Rust面试题及详细答案120道(72-80)
11Rust面试题及详细答案120道(81-89)
12Rust面试题及详细答案120道(90-98)
13Rust面试题及详细答案120道(99-105)
14Rust面试题及详细答案120道(106-114)
15Rust面试题及详细答案120道(115-120)

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

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

相关文章

Horse3D游戏引擎研发笔记(八):在QtOpenGL环境下,按需加载彩虹四边形的顶点属性 (Unity、Unreal Engine、Three.js与Godot)

在上一篇博客中&#xff0c;我们探讨了如何在QtOpenGL环境下使用改进的Uniform变量管理方式绘制多彩四边形。本文将延续这一主题&#xff0c;深入探讨如何在QtOpenGL环境下按需加载彩虹四边形的顶点属性。这一功能是Horse3D引擎渲染系统的重要组成部分&#xff0c;旨在实现灵活…

模块化设计+微米级精度,GelSight Modulus 触觉型3D轮廓仪深入检测“盲区”

当航空航天工程师在精密舱体中搜寻微米级缺陷&#xff0c;汽车检查员在车间复杂结构里排查隐患&#xff0c;能源领域创新者尝试突破检测边界时&#xff0c;深耕视触觉 3D 显微技术的企业——GelSight&#xff0c;正以全新研发的GelSight Modulus触觉型3D轮廓仪&#xff08;简称…

Pytorch安装详细步骤

第一步&#xff1a;检查显卡支持的的CUDA版本 1.打开NVIDIA控制面板 首先鼠标右击桌面-显示更多选项-NVIDIA控制面板-点击弹出界面右上角的(系统信息)-点击弹出界面的(组件) 2.查看驱动版本 打开系统信息 点击组件,查看 以观测到红色方框内的信息可以看到(NVIDIA CUDA 13.0.…

2025职场进阶:低门槛技能实用手册

每到年初&#xff0c;都会有人问&#xff1a;如果只能投入有限的时间与预算&#xff0c;先考哪一两本证书更划算&#xff1f;本文把近两年的岗位需求、学习可获得性与花费周期做了综合权衡&#xff0c;给出一个以“先提升通用能力&#xff0c;再叠加行业资质”为主线的组合方案…

SDC命令详解:使用set_timing_derate命令进行约束

相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定降额比例 指定降额对象列表/集合 指定沿 指定最大、最小条件 指定早、晚条件 指定路径的类型 指定降额类型 指定约束 指定增量 写在最后 由于制造…

C++语言程序设计——03 进制ASCII码

目录一、进制表示与转换&#xff08;一&#xff09;不同进制表示&#xff08;二&#xff09;进制转换方法二、ASCII 码&#xff08;一&#xff09;ASCII 码表&#xff08;二&#xff09;ASCII 码转换&#xff08;三&#xff09;大小写英文字母转换【总结&#xff1a;如何记忆AS…

AtCoder Beginner Contest 420-Toggle Maze

题目描述 有一个 H行 W 列的网格。用 (i,j) 表示位于第 i 行&#xff08;从上往下数&#xff09;第 j 列&#xff08;从左往右数&#xff09;的格子。每个格子的状态用字符 Ai,j表示&#xff0c;含义如下&#xff1a; . &#xff1a;空格子。 #’ &#xff1a;障碍格子。 S &am…

20、DMA----释放CPU压力,加快传输

1、DMA介绍DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA传输方式无需CPU直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为RAM与I/O设备开辟一条直接传送数据的通路&#xff0c;能使…

深入OpenHarmony OTA硬核升级

技术背景 OpenHarmony OTA(Over-The-Air)升级子系统为设备提供了远程升级能力,通过统一的升级接口屏蔽底层芯片差异,支持轻量系统、小型系统和标准系统的全量升级、差分升级和变分区升级。 核心特性 跨系统支持:覆盖轻量系统(Hi3861)、小型系统(Hi3516DV300)、标准系…

华为iVS1800接入SVMSPro平台

华为iVS1800接入SVMSPro平台 ** 华为好望Huawei HolosensIVS1800智能视频云平台采用首款昇腾310加持的嵌入式系统智能微边缘&#xff0c;独俱普惠AI鸿力。一台融合存储、计算、检索功能&#xff0c;满足小型园区、社区、银行网点、超市等场景安防需求&#xff0c;小机大智。 …

《异形战机2》v2.0.4数字豪华版,3D横版射击再临,机体武器海量升级

[游戏名称]: 《异形战机2》v2.0.4数字豪华版 [软件大小]: 17.7 GB [软件大小]: 夸克网盘 | 百度网盘 游戏介绍 《异形战机&#xff1a;最终版2》续作震撼登场&#xff01;经典横版射击全面升级&#xff1a;3D 画面炫目、关卡与机体海量扩充&#xff0c;只为带来酣畅淋漓的灭…

Java 异常(Throwable)

1. Throwable Throwable: 所有异常和错误的根类。实现 Throwable 或其子类的对象才能被 throw 或 catch。 Error: 表示严重的系统级问题&#xff0c;通常不应该被捕获或处理&#xff0c;程序通常无法从中恢复。 Exception: 表示程序可以处理的问题。分为 运行时异常、 受检异常…

rocketmq常用命令

官方文档 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ运维管理命令mqadm…

【C++详解】哈希表概念与实现 开放定址法和链地址法、处理哈希冲突、哈希函数介绍

文章目录一、unordered系列的使用unordered_set类的介绍unordered_set和set的使⽤差异unordered_map和map的使⽤差异unordered_xxx的哈希相关接⼝二、哈希表实现哈希概念直接定址法哈希冲突负载因⼦将关键字转为整数哈希函数除法散列法/除留余数法乘法散列法处理哈希冲突开放定…

电影感人文街拍摆摊纪实摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍电影感人文街拍摆摊纪实摄影后期 Lr 调色是一种专注于捕捉街头生活烟火气的摄影风格&#xff0c;通过 Lightroom 后期调色赋予画面电影般的叙事感和情感深度。这种风格以摆摊小贩、市井行人、街头场景为主体&#xff0c;强调真实、自然的生活瞬间。调色核心在于低饱和暖…

【数据分享】298个地级市人工智能企业数量(1990-2023)

数据介绍引言人工智能产业作为数字经济的核心驱动力&#xff0c;其发展规模与分布格局深刻反映区域科技创新活力与产业升级潜力。为助力相关研究&#xff0c;本文分享一份涵盖全国 298 个地级市 1990-2023 年的人工智能企业核心数据&#xff0c;包含人工智能企业存量和人工智能…

LeetCode 面试经典 150_双指针_验证回文串(25_125_C++_简单)(双指针)

LeetCode 面试经典 150_数组/字符串_验证回文串&#xff08;25_125_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;双指针&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;双…

无障碍辅助模块|Highcharts引领可访问数据可视化的交流

在现代数据可视化中&#xff0c;无障碍辅助技术已成为必不可少的一部分。对于视障人士或使用屏幕阅读器的用户来说&#xff0c;传统图表往往难以获取有效信息&#xff0c;而 Highcharts 在设计之初便充分考虑了无障碍体验。 Highcharts作为可访问数据可视化的倡导者&#xff0…

从0到1:数据库进阶之路,解锁SQL与架构的奥秘

目录一、SQL 基础启航1.1 SQL 基础语法1.2 SQL 进阶查询1.3 SQL 实战案例分析二、分库分表实战2.1 分库分表的背景与原理2.2 分库分表策略设计2.3 分布式 ID 生成2.4 数据迁移方案三、中间件实战3.1 中间件概述3.2 DBLE 中间件实战3.3 MyCat 中间件实战四、高可用架构搭建4.1 高…

【数据结构入门】排序算法(2):直接选择排序->堆排序

目录 1.直接选择排序 1.1 思想 1.2 代码 2.堆排序 2.1 向下调整算法 2.1.1 代码 2.2 建堆 2.2.1 代码 2.3 正式排序 2.3.1 代码 3. 冒泡排序 3.1 思路 3.1.1 单趟排序 3.1.2 多趟排序 3.1.3优化 3.2 代码 1.直接选择排序 1.1 思想 每次从未排序区中选择一个最小…