Ich möchte einen Vektor von Nullen mit einer bestimmten Größe initialisieren, die zur Laufzeit festgelegt wird.
In C wäre es wie:
int main(void)
{
uint size = get_uchar();
int A[size][size];
memset(A, 0, size*size*sizeof(int));
}
Hier ist die Hilfsfunktion, die ich versucht habe, in Rust zu schreiben, aber ich denke, die Slicing-Syntax 0..size
beleidigt den Compiler. Außerdem sieht es ausführlicher aus als die C-Version. Gibt es einen idiomatischeren Weg, dies zu tun?
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;
}
Ich schwöre, dass die alten Dokumente hier eine from_elem()
Methode erklärt haben und keine der Permutationen der [0 ; size]
Notation zu funktionieren scheint
Ich möchte dies letztendlich in einen Teilstring-Suchalgorithmus einfügen:
pub fn kmp(text: &str, pattern: &str) -> i64 {
let mut shifts = zeros(pattern.len()+1);
}
let mut shifts = vec![0; pattern.len()];
arbeite jetzt direkt ... Ups. Vorher hatte ich einerror: expected
:, found
.` ../search.rs:17 zero_vec.push (0); `was keinen Sinn ergab.rustup.sh
, um Rust zu aktualisieren? Wenn ja, möchten Sie vielleicht die neueste Version des Skripts erhalten, die jetzt die Beta anstelle von Nightlies erhält.rustup.sh
. Vielen Dank! Jetzt muss ich nur noch denHier ist ein anderer Weg, viel kürzer. Es funktioniert mit 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) } }
quelle
Sie können auch die
iter::repeat
Funktion verwenden, die meiner Meinung nach "idiomatischer" ist (und für mich einfach besser aussieht):use std::iter; fn zeros(size: usize) -> Vec<i32> { iter::repeat(0).take(size).collect() }
quelle
vec!
Version auch gut aussieht. Ich nehme an, es könnte nicht schaden, einige Benchmarks auszuprobieren, die ich machen könnte, wenn ich nach Hause komme.::<Vec<i32>>
Ist überflüssig. Typinferenz kann dies automatisch herausfinden, da es sich um den Typ des Ausdrucks handeln muss. Sie können ihn also einfach.collect()
hier verwenden.Sie können die Größenänderung verwenden
let mut v = Vec::new(); let l = 42; v.resize(l, 0u32);
quelle
vec!
ist effizienter bei der Zuweisung von 0, da es verwendetRawVec::with_capacity_zeroed()
, während.resize()
Aufrufe,.extend_with()
die einen komplexeren Wertgenerator verwenden. Für andere Werte verwenden beide,.extend_with()
so dass der Nutzen ungefähr gleich ist.