返回Rust中向量的最后n个元素,而不会改变向量

Mat*_*son 2 vector rust

我正在努力寻找一种方法从矢量的末尾取两个值,对这些值求和,并将和推送到矢量.

我发现pop,truncatedrain不工作,因为他们从原来的矢量取出值.

fn main() {
    println!("Which Fibonacci number would you like to find?");

    let mut fib_num = String::new();

    io::stdin().read_line(&mut fib_num)
        .expect("Failed to read line");

    let fib_num: u32 = fib_num.trim().parse()
        .expect("Please enter a number");

    let mut stored_nums: Vec<u32> = vec![0, 1];

    while fib_num > stored_nums.len() as u32 {
        let mut limit = stored_nums.len();
        let mut new_num1 = stored_nums.pop().unwrap();
        let mut new_num2 = stored_nums.pop().unwrap_or(0);
        stored_nums.push(new_num1 + new_num2);
    }
}
Run Code Online (Sandbox Code Playgroud)

Gre*_*ird 10

要检索最后 n 个元素,只需将其转换为切片即可。

例如获取最后 3 个元素:

let v = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let last3 = v.as_slice()[v.len()-3..].to_vec();

println!("{:?}", last3); // [7, 8, 9]
Run Code Online (Sandbox Code Playgroud)


She*_*ter 8

您需要考虑向量没有两个项目的情况.

我会使用迭代器适配器像Iterator::revIterator::take,然后用完成Iterator::sum:

let sum = stored_nums.iter().rev().take(2).sum();
stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)

这允许您避免显式处理vector/slice/iterator太短但代码仍然隐式处理它的情况.


您也可以直接索引切片:

let len = stored_nums.len();
let sum = stored_nums[len - 1] + stored_nums[len - 2];
stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)

但是,如果少于2个元素,则会发生混乱.

你可以尝试在这种情况下处理太短的向量,但它并不漂亮:

let len = stored_nums.len();

let idx_a = len.checked_sub(1);
let idx_b = len.checked_sub(2);

let a = idx_a.and_then(|idx| stored_nums.get(idx).cloned());
let b = idx_b.and_then(|idx| stored_nums.get(idx).cloned());

let sum = a.unwrap_or(0) + b.unwrap_or(0);

stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)

请注意,使用Fibonacci迭代器可能更好,只需collect将其用于Vec.