Rust动态数组Vec
文章目录
- 初步示例
- 创建动态数组
- 增删改
- 迭代
初步示例
Rust提供了动态数组这种数据类型,所谓动态,就是长度可变,示例如下
fn main(){
let mut vec = Vec::new();
for i in 1..5{
vec.push(i);
}
for i in &vec{
println!("{}", i);
}
}
其中,push用于在末尾添加一个元素。
虽然名为动态数组,但从内存分配的角度来说,Vec中存在一个静态连续的内存区域,用以提高性能。这部分容量可通过capacity()来获取,而当前数组中元素个数,则用len()来得到。
fn main(){
let v=vec![1,2,3];
println!("len():{}", v.len());
println!("capacity():{}", v.capacity());
// 二者都是3
}
创建动态数组
在Rust中,除了通过Vec::new()
创建一个空的动态数组之外,也支持指定元素创建
let v = vec![1, 2, 3];
通过with_capacity方法,可以创建一个指定容量的数组
fn main(){
let mut v:Vec<i32> = Vec::with_capacity(10);
println!("len():{}", v.len());
println!("capacity():{}", v.capacity());
}
其长度为0,容量为10。
增删改
Vec提供了一系列添加、删除以及改动元素的方式
方法 | 说明 | 方法 | 说明 |
---|---|---|---|
pop | 弹出末尾的元素 | push | 在末尾添加元素 |
remove | 移除某个位置的元素 | insert | 在某个位置插入元素 |
append | 在结尾拼接一个数组 | ||
clear | 清空 | truncate | 截断 |
dedup | 移除相邻且重复的元素 | retain | 保留复合条件的值 |
其中,append输入参数为另一个引用的动态数组,如果想要引用自身,则需克隆一下。
fn main(){
let mut v1 = vec![1, 2, 3];
v1.append(&mut v1.clone());
println!("{}", v1.len());
}
有关dedup的详细解读,可见Rust根据条件删除相邻元素
迭代
动态数组可直接通过for循环进行迭代,前面的示例中已经介绍了&v
在迭代中的表现,但是,若想修改迭代中的值,则需通过&mut
进行引用。这两种迭代方式,可分别对应iter()和iter_mut()。
fn main(){
let mut v = vec![1, 2, 3];
for i in &mut v{
*i += 5;
}
for i in v.iter_mut(){
*i *= 2;
}
for i in v.iter(){
println!("{}", i);
}
}
输出为 12 , 14 , 16 12,14,16 12,14,16。
Vec提供了一系列sort函数,其中最简单的是sort(),其功能是将数组从小到大进行排列。
fn main(){
let mut v = [-5, 4, 1, -3, 2];
v.sort();
println!("{:?}", v);
}
运行结果为
[-5, -3, 1, 2, 4]