在可变 Vec 中弹出最后 N 个元素的惯用方法是什么?
What is the idiomatic way to pop the last N elements in a mutable Vec?
我正在向 RosettaCode 贡献 Rust 代码,以学习 Rust 并同时为 Rust 社区做出贡献。弹出可变 Vec
中最后 n 个元素的最佳惯用方法是什么?
这是我写的大致内容,但我想看看是否有更好的方法:
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)
}
}
您应该看看标准库中的 Vec::truncate
函数,它可以为您做这件事。
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;
nums.truncate(new_len);
for e in nums {
println!("{}", e)
}
}
我建议使用 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);
}
此外,我
- 使用
saturating_sub
处理向量中没有 N
个元素的情况
- 使用
vec![]
轻松构建数字向量
- 一次性打印出整个向量
通常当您 "pop" 某些东西时,您希望拥有这些值。如果你想要另一个向量中的值,你可以使用 Vec::split_off
:
let tail = nums.split_off(final_length);
如果你想访问元素但不想创建一个全新的向量,你可以使用 Vec::drain
:
for i in nums.drain(final_length..) {
println!("{}", i)
}
另一种方法是使用 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);
}
}
drain 方法接受 <start-inclusive>..<end-exclusive>
形式的 RangeArgument
。 start 和 end 都可以省略以默认为向量的 beginning/end。所以在上面,我们实际上只是说从 new_len
开始,一直排到最后。
我正在向 RosettaCode 贡献 Rust 代码,以学习 Rust 并同时为 Rust 社区做出贡献。弹出可变 Vec
中最后 n 个元素的最佳惯用方法是什么?
这是我写的大致内容,但我想看看是否有更好的方法:
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)
}
}
您应该看看标准库中的 Vec::truncate
函数,它可以为您做这件事。
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;
nums.truncate(new_len);
for e in nums {
println!("{}", e)
}
}
我建议使用 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);
}
此外,我
- 使用
saturating_sub
处理向量中没有N
个元素的情况 - 使用
vec![]
轻松构建数字向量 - 一次性打印出整个向量
通常当您 "pop" 某些东西时,您希望拥有这些值。如果你想要另一个向量中的值,你可以使用 Vec::split_off
:
let tail = nums.split_off(final_length);
如果你想访问元素但不想创建一个全新的向量,你可以使用 Vec::drain
:
for i in nums.drain(final_length..) {
println!("{}", i)
}
另一种方法是使用 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);
}
}
drain 方法接受 <start-inclusive>..<end-exclusive>
形式的 RangeArgument
。 start 和 end 都可以省略以默认为向量的 beginning/end。所以在上面,我们实际上只是说从 new_len
开始,一直排到最后。