rust std
时间轴
2025-10-22
add Vec, others todo
bit manipulation
位统计
| 方法名 | 返回值类型 | 作用 | 示例输入 | 示例输出 |
|---|---|---|---|---|
count_ones() |
u32 |
统计二进制中 1 的个数 |
0b1011_0001u8 |
4 |
count_zeros() |
u32 |
统计二进制中 0 的个数 |
0b1011_0001u8 |
4(8 位中有 4 个 0) |
leading_zeros() |
u32 |
统计前导 0(从高位到第一个1之间的0数量) | 0b0001_0000u8 |
3 |
trailing_zeros() |
u32 |
统计末尾 0(从最低位开始) | 0b0010_0000u8 |
5 |
leading_ones() |
u32 |
统计前导 1数量 | 0b1110_0000u8 |
3 |
trailing_ones() |
u32 |
统计末尾 1数量 | 0b0001_1111u8 |
5 |
1 | fn main() { |
输出:
1 | [zhaohang@cyberboy rust_programming]$ cargo run |
primitive-like collections
基础序列类型,在标准库的顶层模块里,而不是std::collections,在预导入模块里,不用显示导入
Vec
构造
vec![]
用vec宏比较方便,可以在构造时初始化一些值
1 | macro_rules! vec { |
Examples
1 | let v = vec![1, 2, 3]; |
Vec::new()
1 | pub const fn new() -> Vec<T> |
- Constructs a new, empty Vec
. The vector will not allocate until elements are pushed onto it.
Examples
1 | let mut vec: Vec<i32> = Vec::new(); |
Vec::with_capacity()
1 | pub fn with_capacity(capacity: usize) -> Vec<T> |
-
Constructs a new, empty
Vec<T>with at least the specified capacity. -
If
capacityis zero, the vector will not allocate. -
For
Vec<T>whereTis a zero-sized type, there will be no allocation and the capacity will always beusize::MAX.
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
1 | let mut vec = Vec::with_capacity(10); |
Vec::from_raw_parts()
1 | pub unsafe fn from_raw_parts( |
-
Creates a
Vec<T>directly from a pointer, a length, and a capacity. -
This is highly unsafe, due to the number of invariants that aren’t checked:
-
T needs to have the same alignment as what ptr was allocated with.
-
ptr must have been allocated using the global allocator, such as via the alloc::alloc function
用C的ptr是不安全的,因为Vec在Drop时会调用rust allocator的dealloc,但这个内存是C分配的,不安全
-
length needs to be less than or equal to capacity
-
The first
lengthvalues must be properly initialized values of typeT -
capacity needs to be the capacity that the pointer was allocated with
-
The allocated size in bytes must be no larger than
isize::MAX
-
1 | use std::ptr; |
using memory that was allocated else where
1 | use std::alloc::{alloc, Layout}; |
属性访问
vec.len
1 | pub const fn len(&self) -> usize |
返回元素个数
vec.is_empty
1 | pub const fn is_empty(&self) -> bool |
没有元素就返回真,否则返回false
访问元素
修改元素
vec.resize
1 | pub fn resize(&mut self, new_len: usize, value: T) |
Resizes the
Vecin-place so thatlenis equal tonew_len.
Examples
1 | let mut vec = vec!["hello"]; |
vec.resize_with
1 | pub fn resize_with<F>(&mut self, new_len: usize, f: F) |
Resizes the
Vecin-place so thatlenis equal tonew_len.
Examples
1 | let mut vec = vec![1, 2, 3]; |
插入元素
vec.insert
1 | pub fn insert(&mut self, index: usize, element: T) |
Inserts an element at position
indexwithin the vector, shifting all elements after it to the right.
Panics
Panics if index > len.
Examples
1 | let mut vec = vec!['a', 'b', 'c']; |
vec.push
1 | pub fn push(&mut self, value: T) |
Appends an element to the back of a collection.
Panics
Panics if the new capacity exceeds isize::MAX bytes.
Examples
1 | let mut vec = vec![1, 2]; |
vec.append
1 | pub fn append(&mut self, other: &mut Vec<T, A>) |
Moves all the elements of
otherintoself, leavingotherempty.
Examples
1 | let mut vec = vec![1, 2, 3]; |
vec.extend_from_slice
1 | pub fn extend_from_slice(&mut self, other: &[T]) |
Clones and appends all elements in a slice to the
Vec.
Examples
1 | let mut vec = vec![1]; |
vec.extend_from_within
1 | pub fn extend_from_within<R>(&mut self, src: R) |
Given a range
src, clones a slice of elements in that range and appends it to the end.
srcmust be a range that can form a valid subslice of theVec.
Examples
1 | let mut characters = vec!['a', 'b', 'c', 'd', 'e']; |
vec.into_flattened
1 | pub fn into_flattened(self) -> Vec<T, A> |
Takes a
Vec<[T; N]>and flattens it into aVec<T>.
Examples
1 | let mut vec = vec![[1, 2, 3], [4, 5, 6], [7, 8, 9]]; |
删除元素
vec.pop
1 | pub fn pop(&mut self) -> Option<T> |
Removes the last element from a vector and returns it, or None if it is empty.
Examples
1 | let mut vec = vec![1, 2, 3]; |
vec.pop_if
1 | pub fn pop_if(&mut self, predicate: impl FnOnce(&mut T) -> bool) -> Option<T> |
Removes and returns the last element from a vector if the predicate returns
true, or None if the predicate returns false or the vector is empty (the predicate will not be called in that case).
Examples
1 | let mut vec = vec![1, 2, 3, 4]; |
vec.truncate
1 | pub fn truncate(&mut self, len: usize) |
Shortens the vector, keeping the first
lenelements and dropping the rest.If
lenis greater or equal to the vector’s current length, this has no effect.
Examples
1 | let mut vec = vec![1, 2, 3, 4, 5]; |
vec.drain
1 | pub fn drain<R>(&mut self, range: R) -> Drain<'_, T, A> ⓘ |
drain会“抽干”Vec里指定索引范围的元素,返回一个迭代器Drain,可以逐个访问这些被移除的元素。
R可以是任何表示索引范围的类型,比如:0..3、2..、..5。
Examples
1 | let mut v = vec![1, 2, 3]; |
vec.remove
1 | pub fn remove(&mut self, index: usize) -> T |
Removes and returns the element at position
indexwithin the vector, shifting all elements after it to the left.
Panics
Panics if index is out of bounds.
Examples
1 | let mut v = vec!['a', 'b', 'c']; |
vec.swap_remove
1 | pub fn swap_remove(&mut self, index: usize) -> T |
Removes an element from the vector and returns it.
The removed element is replaced by the last element of the vector.
Examples
1 | let mut v = vec!["foo", "bar", "baz", "qux"]; |
vec.retain
1 | pub fn retain<F>(&mut self, f: F) |
Retains only the elements specified by the predicate.
Examples
1 | let mut vec = vec![1, 2, 3, 4]; |
vec.retain_mut
1 | pub fn retain_mut<F>(&mut self, f: F) |
Retains only the elements specified by the predicate, passing a mutable reference to it.
Examples
1 | let mut vec = vec![1, 2, 3, 4]; |
vec.clear
1 | pub fn clear(&mut self) |
Clears the vector, removing all values.
Note that this method has no effect on the allocated capacity of the vector.
Examples
1 | let mut v = vec![1, 2, 3]; |
vec.split_off
1 | pub fn split_off(&mut self, at: usize) -> Vec<T, A> |
Splits the collection into two at the given index.
Returns a newly allocated vector containing the elements in the range
[at, len).
Examples
1 | let mut vec = vec!['a', 'b', 'c']; |
vec.dedup
1 | pub fn dedup(&mut self) |
Removes consecutive repeated elements in the vector according to the
PartialEqtrait implementation.If the vector is sorted, this removes all duplicates.
Examples
1 | let mut vec = vec![1, 2, 2, 3, 2]; |
1 | fn main() { |
遍历
String
std::collections
VecDeque
LinkedList
HashMap
BTreeMap
BinaryHeap
Cost of Collection Operations
| get(i) | insert(i) | remove(i) | append(Vec(m)) | split_off(i) | range | append | |
|---|---|---|---|---|---|---|---|
Vec |
O(1) | O(n-i)* | O(n-i) | O(m)* | O(n-i) | N/A | N/A |
VecDeque |
O(1) | O(min(i, n-i))* | O(min(i, n-i)) | O(m)* | O(min(i, n-i)) | N/A | N/A |
LinkedList |
O(min(i, n-i)) | O(min(i, n-i)) | O(min(i, n-i)) | O(1) | O(min(i, n-i)) | N/A | N/A |
HashMap |
O(1)~ | O(1)~* | O(1)~ | N/A | N/A | N/A | N/A |
BTreeMap |
O(log(n)) | O(log(n)) | O(log(n)) | N/A | N/A | O(log(n)) | O(n+m) |
Note that where ties occur, Vec is generally going to be faster than VecDeque, and VecDeque is generally going to be faster than LinkedList.