Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Vec::len() / is_empty() / contains() / get()
RustのVecには要素数の取得・検索・安全なアクセスなど便利なメソッドが揃っています。『len()』『is_empty()』『contains()』『get()』などがよく使われます。
構文
let v = vec![10, 20, 30, 40, 50]; // 要素数を返します。 let len = v.len(); // 5 // 空かどうかを返します。 let empty = v.is_empty(); // false // 要素が含まれているか確認します。 let has = v.contains(&30); // true(参照を渡します) // 安全なインデックスアクセス(Option<&T>)です。 let x = v.get(2); // Some(&30) let y = v.get(10); // None(範囲外) // 先頭・末尾の要素を参照します(Option<&T>)。 let first = v.first(); // Some(&10) let last = v.last(); // Some(&50) // 条件を満たす最初の要素を探します。 let found = v.iter().find(|&&x| x > 25); // Some(&30) // 条件を満たす最初のインデックスを返します。 let idx = v.iter().position(|&x| x == 30); // Some(2)
メソッド一覧
| メソッド | 概要 |
|---|---|
| v.len() | Vecの要素数を返します。 |
| v.is_empty() | Vecが空かどうかを返します。 |
| v.contains(&x) | 値xが含まれていれば true を返します。 |
| v.get(i) | インデックスiの要素をOption<&T>で返します。 |
| v.get_mut(i) | インデックスiの要素をOption<&mut T>で返します。 |
| v.first() | 先頭の要素をOption<&T>で返します。 |
| v.last() | 末尾の要素をOption<&T>で返します。 |
| v.iter().find(|x| 条件) | 条件を満たす最初の要素をOption<&T>で返します。 |
| v.iter().position(|x| 条件) | 条件を満たす最初のインデックスをOption<usize>で返します。 |
| v.iter().any(|x| 条件) | 条件を満たす要素が1つでもあれば true を返します。 |
| v.iter().all(|x| 条件) | 全要素が条件を満たせば true を返します。 |
| v.windows(n) | n要素のウィンドウスライスのイテレータを返します。 |
| v.chunks(n) | n要素ずつのスライスのイテレータを返します。 |
サンプルコード
fn main() {
let v = vec![10, 20, 30, 40, 50];
// 基本的なメタ情報です。
println!("len: {}", v.len());
println!("is_empty: {}", v.is_empty());
let empty: Vec<i32> = vec![];
println!("空Vec.is_empty: {}", empty.is_empty());
println!();
// contains で存在確認します。
println!("30を含む: {}", v.contains(&30));
println!("99を含む: {}", v.contains(&99));
println!();
// get で安全なアクセスをします。
println!("v.get(2) = {:?}", v.get(2)); // Some(&30)
println!("v.get(5) = {:?}", v.get(5)); // None(範囲外)
// get_mut で可変参照を取得します。
let mut v2 = vec![1, 2, 3, 4, 5];
if let Some(x) = v2.get_mut(2) {
*x = 99; // インデックス2の値を変更します。
}
println!("get_mut後: {:?}", v2);
println!();
// first / last で先頭・末尾にアクセスします。
println!("first: {:?}", v.first());
println!("last: {:?}", v.last());
println!();
// イテレータメソッドでの検索です。
let found = v.iter().find(|&&x| x > 25);
println!("25より大きい最初の値: {:?}", found);
let idx = v.iter().position(|&x| x == 40);
println!("40のインデックス: {:?}", idx);
// any / all での判定です。
println!("50より大きい要素がある: {}", v.iter().any(|&x| x > 50));
println!("全要素が0より大きい: {}", v.iter().all(|&x| x > 0));
println!();
// windows(ウィンドウスライス)です。
let w: Vec<&[i32]> = v.windows(3).collect();
println!("windows(3): {:?}", w);
// chunks(n要素ずつ)です。
let c: Vec<&[i32]> = v.chunks(2).collect();
println!("chunks(2): {:?}", c);
}
概要
『get()』と添字アクセス(v[i])の使い分けが重要です。インデックスの範囲が確実にわかっている場合は添字アクセス、外部入力や動的なインデックスには『get()』を使うと安全です。
『contains()』の引数は値への参照(&x)を渡します。これは比較をゼロコピーで行うためです。大きなVecでの線形探索はO(n)なので、高速な検索が必要な場合はHashSetやBTreeSetの使用を検討してください。
v[i]による添字アクセスは範囲外でパニックします。インデックスの正当性が保証できない場合は必ずget()を使ってください。
Vecの生成方法は『Vec::new() / vec![]』、ソート・重複削除は『Vec::sort() / dedup() / extend()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。