vector - 在不改变向量的情况下返回 Rust 中向量的最后 n 个元素

标签 vector rust

我正在努力寻找一种方法来从向量的末尾获取两个值,对这些值求和,然后将总和插入向量。

我发现 poptruncatedrain 不起作用,因为它们从原始向量中删除了值。

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);
    }
}

最佳答案

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

我会使用像 Iterator::rev 这样的迭代器适配器和 Iterator::take然后以 Iterator::sum 结束:

let sum = stored_nums.iter().rev().take(2).sum();
stored_nums.push(sum);

这使您可以避免显式处理向量/切片/迭代器太短但代码仍然隐式处理的情况。


你也可以直接索引切片:

let len = stored_nums.len();
let sum = stored_nums[len - 1] + stored_nums[len - 2];
stored_nums.push(sum);

但是,如果元素少于 2 个,这将 panic。

在这种情况下,您可以尝试处理向量太短的问题,但这有点冗长:

fn add_last_two(nums: &[u32]) -> Option<u32> {
    let len = nums.len();

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

    let a = nums.get(idx_a)?;
    let b = nums.get(idx_b)?;

    Some(a + b)
}

fn main() {
    let mut stored_nums: Vec<u32> = vec![0, 1];
    let sum = add_last_two(&stored_nums).unwrap_or(0);
    stored_nums.push(sum);
}

请注意,使用 a Fibonacci iterator 可能会更好并将其收集Vec中。

关于vector - 在不改变向量的情况下返回 Rust 中向量的最后 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44549759/

相关文章:

sqlite - 如何在 rusqlite 中取回一行数据?

c++ - 遍历 vector 中除第一个元素以外的所有元素

java - 定义未知类型对象的数组并在构造函数中分配正确类型的对象

c++ - 有没有更好的方法来打印最多 N 个字符的字符串?

c++ - 在 vector 中存储重复字符串时节省内存?

python - 图上的 C++ 反向传播;异构载体?

rust - 如何分配与高速缓存行的大小对齐的Vec <u8>?

rust - 模式匹配后保存 Vec

pointers - 如何在不一直取消引用指针的情况下修复错误 "cannot move out of dereference"?

rust - 我需要帮助在不同的函数中使用可变引用