2015-04-09 22 views
23

Vorrei inizializzare un vettore di zeri con una dimensione specifica determinata in fase di esecuzione.Creazione di un vettore di zeri per una dimensione specifica

In C, sarebbe come:

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

Ecco la funzione di supporto che ho provato a scrivere a Rust, ma penso che la sintassi per affettare 0..size offende il compilatore. Inoltre, sembra più prolisso della versione C. C'è un modo più idiomatico per fare questo?

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

giuro che i vecchi documenti utilizzati per spiegare un metodo here e nessuna delle permutazioni della [0 ; size]notationfrom_elem() sembrano funzionare

mi piacerebbe attaccare questo in un algoritmo di ricerca stringa in ultima analisi:

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

Se '' vec non funziona per voi, quale versione di Rust sei su!? La mia risposta funziona sulla beta. – anderspitman

+0

Sì, ho aggiornato Rust e ora funziona ...> __ <; Molte grazie! – elleciel

risposta

20

la funzione ha lavorato per me, dopo appena un paio di correzioni di sintassi:

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 non esisteva, size bisogno di essere lanciato come usize, ed i tipi per i vettori necessari per corrispondere (cambiato let mut zero_vec: Vec<i64>-let mut zero_vec: Vec<i32>.

Detto questo, per inizializzare un vettore di zeri (o qualsiasi altro valore) di una data lunghezza, è possibile utilizzare la vec! macro:

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

Ho aggiornato Rust a 1.0 e 'let mut shifts = vec! [0; pattern.len()]; 'funziona direttamente ora ... Oops. Prima di ciò ho avuto un 'error: expected':', found' .' ../search.rs:17 zero_vec.push (0); 'che non aveva senso. – elleciel

+3

Sono stato lì da solo. All'inizio ero molto difficile sapere se stavo usando la sintassi in modo errato, o che la sintassi era appena cambiata dall'ultima volta che ho aggiornato o da quando il documento che stavo leggendo era stato aggiornato. Sono davvero contento di avere la beta ora e molto eccitata per 1.0. Btw stai usando 'rustup.sh' per aggiornare Rust? Se è così, potresti voler ottenere l'ultima versione dello script, che ora prenderà la beta invece dei serali. – anderspitman

+1

Ma questo è il motivo per cui mi piace di più della lingua - il supporto della comunità è meraviglioso, senza downvotes per la mia domanda noob. :) Sì, mi sono curvato l'ultimo 'rustup.sh'. Grazie mille! Ora devo solo capire l'accesso all'indice agli elementi stringa ... – elleciel

6

È anche possibile utilizzare la funzione iter::repeat, che suppongo sia "più idiomatico" (e mi sembra più bello):

use std::iter; 

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

È considerato più idiomatico dell'uso di vec! direttamente? Funzionerebbe più veloce? – anderspitman

+0

@anders Nessuna idea; Sono d'accordo che anche la versione 'vec!' Sia bella. Suppongo che non possa far male provare alcuni benchmark, cosa che potrei fare quando tornerò a casa. – Doorknob

+0

Sì, mi stai chiedendo ora quale sia l'implementazione di vec! è. Vedrò se riuscirò a trovare un po 'di tempo per approfondire questo. – anderspitman

11

Ecco un altro modo, molto più breve. Funziona con 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) 
    } 
} 
+1

In che cosa differisce dall'ultima parte della risposta di @anders? – Shepmaster

1

È possibile utilizzare resize

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