Rust 集合

59 阅读4分钟

在 Rust 中,集合是一种可以存储多个值的数据结构。与内建的数组和元组不同,集合中的数据存储在堆上,这意味着在编译时不需要知道集合的大小,并且集合的大小可以在程序运行时动态增长或缩小。

Rust 标准库提供了几种常见的集合类型,下面将详细介绍这些集合及其使用方法。

1. Vec<T>(动态数组)

Vec<T> 是 Rust 中最常用的集合类型之一,它表示一个可变长度的、同类型元素的动态数组。

创建 Vec<T>

可以使用 Vec::new() 函数创建一个空的 Vec<T>,也可以使用 vec! 宏创建带有初始值的 Vec<T>

fn main() { 
    // 创建一个空的 Vec<i32> 
    let mut v1: Vec<i32> = Vec::new(); 
    // 使用 vec! 宏创建带有初始值的 Vec<i32> 
    let v2 = vec![1, 2, 3]; 
} 

访问元素

可以使用索引或 get 方法来访问 Vec<T> 中的元素。

fn main() { 
    let v = vec![1, 2, 3]; 
    // 使用索引访问元素 
    let first = v[0]; 
    // 使用 get 方法访问元素 
    let second: Option<&i32> = v.get(1); 
    match second { 
        Some(value) => println!("The second element is {}", value), 
        None => println!("No second element found"), 
    } 
} 

修改 Vec<T>

可以使用 push 方法向 Vec<T> 中添加元素,使用 pop 方法移除并返回最后一个元素。

fn main() { 
    let mut v = vec![1, 2, 3]; 
    // 向 Vec 中添加元素 
    v.push(4); 
    // 移除并返回最后一个元素 
    let last = v.pop(); 
    match last { 
        Some(value) => println!("The last element was {}", value), 
        None => println!("The Vec is empty"), 
    } 
}

2. String(字符串)

String 是 Rust 中用于存储可变的 UTF - 8 编码字符串的集合类型。

创建 String

可以使用 String::new() 创建一个空的 String,也可以使用 to_string 方法将其他类型转换为 String

fn main() { 
    // 创建一个空的 String 
    let mut s1 = String::new(); 
    // 将字符串字面量转换为 String 
    let s2 = "hello".to_string(); 
    // 使用 from 函数创建 String 
    let s3 = String::from("world"); 
} 

修改 String

可以使用 push_str 方法添加字符串切片,使用 push 方法添加单个字符。

fn main() { 
    let mut s = String::from("hello"); 
    // 添加字符串切片 
    s.push_str(", world"); 
    // 添加单个字符 
    s.push('!'); 
    println!("{}", s); 
} 

字符串拼接

可以使用 + 运算符或 format! 宏来拼接字符串。

fn main() { 
    let s1 = String::from("hello");
    let s2 = String::from(" world"); 
    // 使用 + 运算符拼接字符串 
    let s3 = s1 + &s2; 
    // 使用 format! 宏拼接字符串 
    let s4 = format!("{}{}", s3, "!"); 
    println!("{}", s4); 
} 

3. HashMap<K, V>(哈希映射)

HashMap<K, V> 是一种键值对存储的数据结构,它使用哈希函数来确定键的存储位置。

创建 HashMap<K, V>

可以使用 HashMap::new() 创建一个空的 HashMap<K, V>,也可以使用迭代器和 collect 方法创建带有初始值的 HashMap<K, V>

use std::collections::HashMap; 
fn main() { 
    // 创建一个空的 HashMap<String, i32> 
    let mut scores = HashMap::new(); 
    // 添加键值对 
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50); 
    // 使用迭代器和 collect 方法创建 HashMap 
    let teams = vec![String::from("Blue"), String::from("Yellow")]; 
    let initial_scores = vec![10, 50]; 
    let scores: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect(); 
} 

访问 HashMap<K, V> 中的值

可以使用 get 方法来访问 HashMap<K, V> 中的值。

use std::collections::HashMap; 
fn main() { 
    let mut scores = HashMap::new(); 
    scores.insert(String::from("Blue"), 10);
    scores.insert(String::from("Yellow"), 50); 
    let team_name = String::from("Blue"); 
    let score: Option<&i32> = scores.get(&team_name); 
    match score { 
        Some(value) => println!("The score of {} is {}", team_name, value),
        None => println!("No score found for {}", team_name), 
    } 
} 

修改 HashMap<K, V>

可以使用 insert 方法插入或更新键值对,使用 remove 方法移除键值对。

use std::collections::HashMap; 
fn main() { 
    let mut scores = HashMap::new(); 
    scores.insert(String::from("Blue"), 10); 
    // 更新键值对 
    scores.insert(String::from("Blue"), 20); 
    // 移除键值对 
    scores.remove(&String::from("Blue")); 
} 

4. HashSet<T>(哈希集合)

HashSet<T> 是一种只存储唯一值的集合,它基于 HashMap<T, ()> 实现。

创建 HashSet<T>

可以使用 HashSet::new() 创建一个空的 HashSet<T>,并使用 insert 方法添加元素。

use std::collections::HashSet; 
fn main() { 
    let mut set = HashSet::new(); 
    // 添加元素 
    set.insert(1); 
    set.insert(2); 
    set.insert(3); 
} 

检查元素是否存在

可以使用 contains 方法检查 HashSet<T> 中是否包含某个元素。

use std::collections::HashSet; 
fn main() { 
    let mut set = HashSet::new(); 
    set.insert(1); 
    if set.contains(&1) { 
        println!("The set contains 1"); 
    } else { 
        println!("The set does not contain 1"); 
    } 
}

移除元素

可以使用 remove 方法从 HashSet<T> 中移除元素。

use std::collections::HashSet; 
fn main() { 
    let mut set = HashSet::new(); 
    set.insert(1); 
    // 移除元素 
    set.remove(&1); 
} 

这些集合类型为 Rust 开发者提供了强大而灵活的数据存储和操作能力,能够满足各种不同的编程需求。