我正在向RosettaCode贡献Rust代码,以便学习Rust并同时为Rust社区做出贡献.弹出mutable中最后n个元素的最佳惯用方法是什么Vec?
这大致是我写的,但我想看看是否有更好的方法:
fn main() {
let mut nums: Vec<u32> = Vec::new();
nums.push(1);
nums.push(2);
nums.push(3);
nums.push(4);
nums.push(5);
let n = 2;
for _ in 0..n {
nums.pop();
}
for e in nums {
println!("{}", e)
}
}
Run Code Online (Sandbox Code Playgroud)
(游乐场链接)
She*_*ter 10
我建议使用Vec::truncate:
fn main() {
let mut nums = vec![1, 2, 3, 4, 5];
let n = 2;
let final_length = nums.len().saturating_sub(n);
nums.truncate(final_length);
println!("{:?}", nums);
}
Run Code Online (Sandbox Code Playgroud)
另外,我
saturating_sub处理N向量中没有元素的情况vec![]轻松构造数字向量通常当你"弹出"某些东西时,你想拥有这些值.如果您想要另一个向量中的值,您可以使用Vec::split_off:
let tail = nums.split_off(final_length);
Run Code Online (Sandbox Code Playgroud)
如果要访问元素但不想创建全新的矢量,可以使用Vec::drain:
for i in nums.drain(final_length..) {
println!("{}", i)
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用Vec::drain代替。这为您提供了一个迭代器,因此您可以实际使用已删除的元素。
fn main() {
let mut nums: Vec<u32> = Vec::new();
nums.push(1);
nums.push(2);
nums.push(3);
nums.push(4);
nums.push(5);
let n = 2;
let new_len = nums.len() - n;
for removed_element in nums.drain(new_len..) {
println!("removed: {}", removed_element);
}
for retained_element in nums {
println!("retained: {}", retained_element);
}
}
Run Code Online (Sandbox Code Playgroud)
排水方法接受RangeArgument形式为 的 a <start-inclusive>..<end-exclusive>。start 和 end 都可以省略以默认为向量的开头/结尾。所以上面,我们真的只是说开始new_len并排到最后。
| 归档时间: |
|
| 查看次数: |
3052 次 |
| 最近记录: |