📌 コレクションとは
Rust の標準ライブラリには複数のオブジェクトを管理する便利なデータ構造が用意されています.これらを コレクション と呼びます.コレクションはヒープメモリに置かれます.ここでは代表的なコレクションを解説します.
📌 Vec型
Vec
型(ベクタ)は伸縮可能な配列です.空のベクタを作成するにはVec::new
関数を使います:
let v: Vec<i32> = Vec::new();
初期値を指定してベクタを作成する場合はvec!
マクロを使います:
let v = vec![1, 2, 3];
各要素を取り出して処理する一般的な方法はfor式を使います:
let v = vec![100, 32, 57];
for i in &v {
println!("{}", i);
}
以下は、Vec型のメソッドの一部です:
insert(&mut self, index: usize, element: T)
remove(&mut self, index: usize) -> T
push(&mut self, value: T)
pop(&mut self) -> Option<T>
append(&mut self, other: &mut Vec<T>)
clear(&mut self)
len(&self) -> usize
is_empty(&self) -> bool
first(&self) -> Option<&T>
first_mut(&mut self) -> Option<&mut T>
last(&self) -> Option<&T>
last_mut(&mut self) -> Option<&mut T>
📌 String型
文字列 を表すString
型もコレクションです.内部では UTF-8 でエンコードされたデータです.文字列型には OsString
型, OsStr
型, CString
型, CStr
型, String
型, str
型などがあります.それぞれ,エンコード方式が違います.String型とstr型のようにペアになっており,str型はスライスです.
文字列の生成はString::new
関数です:
let mut s = String::new();
文字列以外の型から,文字列に変換するにはto_string
メソッドが便利です.これはDisplay
レイトのインスタンスなら自動で実装してくれます.
let i = 5;
let five = i.to_string();
文字列リテラルからの作成は String::from
関数を使います:
let five = String::from("5");
文字列から数値型に変換するには parse
メソッドを使います.これはResult型を返します:
let a_string = String::from("5");
let b = a_string.parse::<i32>()?;
書式付きで文字列を作成するにはformat!
マクロを使います:
let s1 = String::from("tic");
let s2 = String::from("tac");
let s3 = String::from("toe");
let s = format!("{}-{}-{}", s1, s2, s3);
以下は、String型のメソッドの一部です:
push_str(&mut self, string: &str)
push(&mut self, ch: char)
pop(&mut self) -> Option<char>
as_bytes(&self) -> &[u8]
truncate(&mut self, new_len: usize)
insert(&mut self, idx: usize, ch: char)
insert_str(&mut self, idx: usize, string: &str)
remove(&mut self, idx: usize) -> char
len(&self) -> usize
is_empty(&self) -> bool
clar(&mut self)
chars(&self) -> Chars<'_>
bytes(&self) -> Bytes<'_>
starts_with<'a,P>(&'a self, pat: P) -> bool
ends_with<'a,P>(&'a self, pat: P) -> bool
find<'a, P>(&'a self, pat: P) -> Option<usize>
rfind<'a, P>(&'a self, pat: P) -> Option<usize>
trim(&self) -> &str
📌 HashMap型
HashMap
型は連想配列 です.オブジェクトにキーを結びつけて管理します.空の連想配列を作成するにはHashMap::new
関数を使い,新しい要素を挿入する場合はinsert
メソッドを使います:
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
キーに対応した要素を取得するにはget
メソッドを使います:
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
let team_name = String::from("Blue");
let score = scores.get(&team_name);
各要素を取り出す場合はfor式で,キーとオブジェクトを分解束縛します:
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.insert(String::from("Yellow"), 50);
for (key, value) in &scores {
println!("{}: {}", key, value);
}
キーがまだ存在していないときに挿入する場合はentry
メソッドとor_insert
メソッドを使います:
use std::collections::HashMap;
let mut scores = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry(String::from("Yellow")).or_insert(50);
scores.entry(String::from("Blue")).or_insert(50);
println!("{:?}", scores);
2つのベクタから連想配列を作成するにはイテレータを使って,zipメソッドとcollectメソッドを使う方法があります:
use std::collections::HashMap;
let teams = vec![String::from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let mut scores: HashMap<_, _> =
teams.into_iter().zip(initial_scores.into_iter()).collect();
以下は、HashMap型のメソッドの一部です:
keys(&self) -> Keys<'_, K, V>
values(&self) -> Values<'_, K, V>
values_mut(&mut self) -> ValuesMut<'_, K, V>
iter(&self) -> Iter<'_, K, V>
iter_mut(&mut self) -> IterMut<'_, K, V>
len(&self) -> usize
clear(&mut self)
entry(&mut self, key: K) -> Entry<'_, K, V>
contains_key<Q: ?Sized>(&self, k: &Q) -> bool
insert(&mut self, k: K, v: V) -> Option<V>
remove<Q: ?Sized>(&mut self, k: &Q) -> Option<V>