1. 配列とVec型
Rustの配列は, その長さがコンパイル時に既に固定されている必要があります.
従って, 最初から長さのわかっているベクトルを扱う場合には, 例えばその長さNを
const N: usize = 128;
とコンパイル時定数として導入することで, 素直に配列をつくることができます.
const N: usize = 128;
fn main() {
let x: [ f64; N ] = [ 0.; N ];
}
一方, コンパイル時には長さが決まっておらず実行時に動的に決定される場合,
または実行時にコマンドライン引数として長さを与えたい場合,
コンパイル時には配列の長さが決まっていない訳なので, それを配列として実現することはできません.
そのような状況ではVec型 (Vectorとも) を利用しましょう.
2. Vec型の宣言と要素の追加, 参照, 削除
例えば要素が既知のi32型を要素とするVec型変数
a
は
let a: Vec<i32> = vec![ 0, 1, 2, 3, 4 ];
により宣言できます. あるいは,
f64型を要素として持つことのできる空のVec型変数v
を宣言するには
let mut v: Vec<f64> = Vec::new();
とします. いま変数v
には何も要素がないので, そこに要素を追加するには
v.push(0.0)
とすればよいです. 要素をpushするためには変数がmutableであることが必要です. また, Vectorの要素の型はすべて共通でなければなりません.
なお, あらかじめvectorの要素数が, 例えば上限128と見当がついているのならば
let mut v: Vec<f64> = Vec::with_capacity(128);
とした方が高速に動作します. もちろんこの場合でも128を超えて要素を追加することは可能です.
Vector
v
の要素の値は配列と同じくv[i]
によりアクセスできます.
要素数がNのとき, 引数i
は0からN-1までの値を取り, その範囲外の要素にアクセスしようとするとpanicが引き起こされます.
vector
v
のi
番目の要素を削除したい場合, 削除後に要素を左詰めで繰り上げる場合は
v.remove(i);
を, 削除後空いた場所にv
の最後の要素を詰める場合は
v.swap_remove(i);
とします. 後者の方が高速に動作します.
3. Vectorを引数とする関数
例えばVector
v
を定義し, それを表示する関数outputに代入する次のコードは問題なくコンパイルを通ります.
fn main() {
let n: usize = 16;
let v: Vec<f64> = Vec::new();
for i in 0..n {
v.push(i as f64);
}
output( n, v );
}
fn output( n: usize, v: Vec<f64> ) {
for i in 0..n {
print!("{} ", v[i] );
}
}
ところが, main
関数の中で, output( n, v );
に続いてvector v
を利用すると,
コンパイルエラーとなりバイナリファイルが生成されません.
これは, 関数output
にvectorを代入する際に所有権が移行 (move) し,
関数output
のスコープから出た時点でv
がメモリから消去されるからです.
これを回避するにはもちろん借用を利用すればよい訳です.
fn main() {
let n: usize = 16;
let v: Vec<f64> = Vec::new();
for i in 0..n {
v.push(i as f64);
}
output( n, &v );
}
fn output( n: usize, v: &Vec<f64> ) {
for i in 0..n {
print!("{} ", v[i] );
}
}
関数の中でvectorの値を変更したい場合は, mutableな借用を利用することになります.
fn main() {
let n: usize = 16;
let v: Vec<f64> = Vec::new();
for i in 0..n {
v.push(i as f64);
}
times2( n, &mut v );
output( n, &v );
}
fn times2( n: usize, v: &mut Vec<f64> ) {
for i in 0..n {
v[i] = v[i] * 2.;
}
}
fn output( n: usize, v: &Vec<f64> ) {
for i in 0..n {
print!("{} ", v[i] );
}
}
4. その他の操作
Vec型
x
の長さはx.len()
で取得できます.
コメント
コメントを投稿