Rust 集合容器
标准库中的集合容器
- Vec
, 动态可增长数组 - VecDeque
, 双端队列 - LinkedList
, 双向链表 - BinaryHeap
, 二叉堆 - HashMap<K, V>, 哈希表
- BTreeMap<K, V>, B树
- HashSet
, 哈希集合 - BTreeSet
, B树集合
Primitive Type slice
A dynamically-sized view into a contiguous sequence, [T]
let vec: Vec<i32> = vec![1, 2, 3];
let int_slice: &[i32] = &vec[..];
可以看到 slice 的类型就是 &[T]
这样。
Struct std::vec::Vec
Vec 是一个动态可增长数组,它的定义如下:
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "Vec")]
#[rustc_insignificant_dtor]
pub struct Vec<T, #[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global> {
buf: RawVec<T, A>,
len: usize,
}
可以看到 Vec 有两个字段,一个是长度,另一个是内部的结构体,负责内存分配相关的。
如果只是小规模的数据,可以尝试用 small-vec
Struct std::collections::HashMap
Rust 的哈希表是通过二次探测和 SIMD 查找实现的。默认的哈希算法是 SipHash 1-3
, 这个可以自己选择其它的算法.
pub struct HashMap<K, V, S = RandomState> {
base: base::HashMap<K, V, S>,
}
Enum std::collections::hash_map::Entry
HashMap 通过 Entry 这种模式来隐藏是否有 key 的细节。
pub enum Entry<'a, K: 'a, V: 'a> {
Occupied(OccupiedEntry<'a, K, V>),
Vacant(VacantEntry<'a, K, V>),
}
Struct std::collections::LinkedList
标准库带的双向链表,定义如下:
pub struct LinkedList<
T,
#[unstable(feature = "allocator_api", issue = "32838")] A: Allocator = Global,
> {
head: Option<NonNull<Node<T>>>,
tail: Option<NonNull<Node<T>>>,
len: usize,
alloc: A,
marker: PhantomData<Box<Node<T>, A>>,
}
struct Node<T> {
next: Option<NonNull<Node<T>>>,
prev: Option<NonNull<Node<T>>>,
element: T,
}