Подтвердить что ты не робот

Создание вектора нулей для определенного размера

Я бы хотел инициализировать вектор нулей с определенным размером, который определяется во время выполнения.

В C это будет выглядеть так:

int main(void)
{
    uint size = get_uchar();
    int A[size][size];
    memset(A, 0, size*size*sizeof(int));
}

Вот вспомогательная функция, которую я пробовал писать в Rust, но я думаю, что синтаксис slicing 0..size нарушает компилятор. Кроме того, он выглядит более подробным, чем версия C. Есть ли более идиоматический способ сделать это?

fn zeros(size: u32) -> Vec<i32> {
    let mut zero_vec: Vec<i32> = Vec::with_capacity(size);
    for i in 0..size {
        zero_vec.push(0);
    }
    return zero_vec;
}

Я клянусь, что старые документы использовали метод from_elem() здесь и ни одна из перестановок [0 ; size] обозначение, похоже, работает

Я хотел бы вставить это в алгоритм поиска подстроки в конечном итоге:

pub fn kmp(text: &str, pattern: &str) -> i64 {
    let mut shifts = zeros(pattern.len()+1);
}
4b9b3361

Ответ 1

Ваша функция работала для меня после исправления синтаксиса пары:

fn zeros(size: u32) -> Vec<i32> {
    let mut zero_vec: Vec<i32> = Vec::with_capacity(size as usize);
    for i in 0..size {
        zero_vec.push(0);
    }
    return zero_vec;
}

uint не существовало, size необходимо было отличить как usize, а типы для векторов, которые должны были соответствовать (изменены let mut zero_vec: Vec<i64> на let mut zero_vec: Vec<i32>.

При этом для инициализации вектора нулей (или любого другого значения) заданной длины вы можете использовать макрос vec!:

let len = 10;
let zero_vec = vec![0; len];

Ответ 2

Вот еще один способ, намного короче. Он работает с Rust 1.0:

fn zeros(size: u32) -> Vec<i32> {
    vec![0; size as usize]
}

fn main() {
    let vec = zeros(10);
    for i in vec.iter() {
        println!("{}", i)
    }
}

Ответ 3

Вы также можете использовать функцию iter::repeat, которая, я полагаю, более "идиоматична" (и выглядит мне лучше):

use std::iter;

fn zeros(size: usize) -> Vec<i32> {
    iter::repeat(0).take(size).collect()
}

Ответ 4

Вы можете использовать resize

let mut v = Vec::new();
let l = 42;
v.resize(l, 0u32);