Как добавить значения в существующий Vec с помощью итератора

У меня Vec со значением по умолчанию [0], а затем я хочу добавить в vec итератор, который читается из stdin, теперь мой код не работает, так как я использую вставку для сдвига всех значений за индексом 0, как улучшить этот код с помощью ржавого стиля?

#[allow(unused_imports)]
use std::cmp::{max, min};
use std::io::{stdin, stdout, BufWriter, Write};

#[derive(Default)]
struct Scanner {
    buffer: Vec<String>,
}
impl Scanner {
    fn next<T: std::str::FromStr>(&mut self) -> T {
        loop {
            if let Some(token) = self.buffer.pop() {
                return token.parse().ok().expect("Failed parse");
            }
            let mut input = String::new();
            stdin().read_line(&mut input).expect("Failed read");
            self.buffer = input.split_whitespace().rev().map(String::from).collect();
        }
    }
}


fn main() {
    let mut scan = Scanner::default();

    let n: usize = scan.next();
    // How to improve these lines?
    let mut arr = (0..n).map(|i| scan.next()).collect();
    arr.insert(0, 0);
}

Ссылка на игровую площадку

2 ответа
2

Использовать Extend<T>:

let mut arr = vec![0];
arr.extend((0..n).map(|_i| scan.next::<i32>()));
// must provide the explicit type:  ^^^^^^^

Или же resize_with:

let mut arr = vec![0];
arr.resize_with(n + 1, || scan.next())

  • Это круто! Rust — такой выразительный язык!

    — доисторический пингвин

  • 1

    В обзорах Code Only отсутствует объяснение того, как и / или почему предлагаемый код лучше, чем OP, пожалуйста, объясните, как и почему вы должны реализовать свое решение, это помогает нам всем понять, как и почему ваш код лучше в этой ситуации. Пожалуйста, прочтите наш раздел помощи о том, как дать хороший ответ

    — Малахия

У меня есть ответ chain

fn main() {
    let mut scan = Scanner::default();
    let n: usize = scan.next();
    let mut arr = vec![0];
    let mut arr: Vec<i32> = arr.into_iter().chain((0..n).map(|i| scan.next())).collect();
    println!("{:?}", arr);
}

  • 1

    Добро пожаловать в Code Review! В обзорах Code Only отсутствует объяснение того, как и / или почему предлагаемый код лучше, чем OP, пожалуйста, объясните, как и почему вы должны реализовать свое решение, это помогает нам всем понять, как и почему ваш код лучше в этой ситуации. Пожалуйста, прочтите наш раздел помощи о том, как дать хороший ответ

    — Малахия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *