Rust-collections
Rust-コレクション
Rustの標準コレクションライブラリは、最も一般的な汎用プログラミングデータ構造の効率的な実装を提供します。 この章では、一般的に使用されるコレクション、Vector、HashMap、HashSetの実装について説明します。
ベクター
Vectorはサイズ変更可能な配列です。 連続したメモリブロックに値を保存します。 定義済みの構造Vecを使用して、ベクトルを作成できます。 ベクトルのいくつかの重要な機能は次のとおりです-
- ベクターは、実行時に拡大または縮小できます。
- ベクターは同種のコレクションです。
- ベクターは、データを特定の順序で要素のシーケンスとして保存します。 ベクター内のすべての要素には、一意のインデックス番号が割り当てられます。 インデックスは0から始まり、n-1になります。nはコレクションのサイズです。 たとえば、5つの要素のコレクションでは、最初の要素はインデックス0になり、最後の要素はインデックス4になります。
- ベクターは、値を末尾に(またはその近くに)追加するだけです。 つまり、Vectorを使用してスタックを実装できます。 *ベクターのメモリはヒープに割り当てられます。
構文-ベクトルの作成
let mut instance_name = Vec::new();
Vecstructureの静的メソッド_new()_を使用して、ベクトルインスタンスを作成します。
または、vec!を使用してベクターを作成することもできます。 マクロ。 構文は以下のとおりです-
let vector_name = vec![val1,val2,val3]
次の表は、Vec構造体で一般的に使用されるいくつかの機能を示しています。
Sr.No | Method | Signature & Description |
---|---|---|
1 | new() |
新しい空のVecを構築します。 ベクトルは、要素がプッシュされるまで割り当てられません。 |
2 | push() |
pub fn push(&mut self, value: T) コレクションの後ろに要素を追加します。 |
3 | remove() |
pub fn remove(&mut self, index: usize) → T ベクトル内の位置インデックスの要素を削除して返し、それ以降のすべての要素を左にシフトします。 |
4 | contains() |
pub fn contains(&self, x: &T) → bool 指定された値の要素がスライスに含まれている場合、trueを返します。 |
5 | len() |
pub fn len(&self) → usize 「長さ」とも呼ばれるベクトル内の要素の数を返します。 |
イラスト:ベクターの作成-new()
ベクトルを作成するには、静的メソッドnew−を使用します
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("size of vector is :{}",v.len());
println!("{:?}",v);
}
上記の例では、構造体_Vec_で定義されている静的メソッド_new()_を使用してベクターを作成します。 _push(val)_関数は、パラメーターとして渡された値をコレクションに追加します。 len()関数は、ベクトルの長さを返します。
出力
size of vector is :3
[20, 30, 40]
イラスト:ベクターの作成-vec! マクロ
次のコードは、vec!を使用してベクトルを作成します! マクロ。 ベクトルのデータ型は、それに割り当てられた最初の値と推測されます。
fn main() {
let v = vec![1,2,3];
println!("{:?}",v);
}
出力
[1, 2, 3]
前述のように、ベクトルには同じデータ型の値のみを含めることができます。 次のスニペットは_error [E0308]:タイプが一致していません_エラーをスローします。
fn main() {
let v = vec![1,2,3,"hello"];
println!("{:?}",v);
}
イラスト:push()
コレクションの末尾に要素を追加します。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
println!("{:?}",v);
}
出力
[20, 30, 40]
イラスト:remove()
ベクトル内の位置インデックスの要素を削除して返し、それ以降のすべての要素を左にシフトします。
fn main() {
let mut v = vec![10,20,30];
v.remove(1);
println!("{:?}",v);
}
出力
[10, 30]
イラスト-含む()
スライスが指定された値を持つ要素が含まれている場合はtrueを返します-
fn main() {
let v = vec![10,20,30];
if v.contains(&10) {
println!("found 10");
}
println!("{:?}",v);
}
出力
found 10
[10, 20, 30]
イラスト:len()
「長さ」とも呼ばれるベクトル内の要素の数を返します。
fn main() {
let v = vec![1,2,3];
println!("size of vector is :{}",v.len());
}
出力
size of vector is :3
ベクターから値にアクセスする
ベクター内の個々の要素には、対応するインデックス番号を使用してアクセスできます。 次の例では、最初の要素の値を出力するベクター広告を作成します。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
println!("{:?}",v[0]);
}
Output: `20`
コレクションへの参照を使用して、ベクター内の値をフェッチすることもできます。
fn main() {
let mut v = Vec::new();
v.push(20);
v.push(30);
v.push(40);
v.push(500);
for i in &v {
println!("{}",i);
}
println!("{:?}",v);
}
出力
20
30
40
500
[20, 30, 40, 500]
ハッシュマップ
- マップは、キーと値のペアのコレクションです(エントリと呼ばれます)。 マップ内の2つのエントリが同じキーを持つことはできません。 要するに、マップはルックアップテーブルです。 HashMapは、キーと値をハッシュテーブルに保存します。 エントリは任意の順序で保存されます。 キーは、HashMapで値を検索するために使用されます。 HashMap構造は、 *std
- collections* モジュールで定義されています。 HashMap構造にアクセスするには、このモジュールを明示的にインポートする必要があります。
構文:HashMapの作成
let mut instance_name = HashMap::new();
_HashMap_構造体の静的メソッド_new()_は、HashMapオブジェクトの作成に使用されます。 このメソッドは、空のHashMapを作成します。
HashMapの一般的に使用される機能は以下に説明されています-
Sr.No | Method | Signature & Description |
---|---|---|
1 | insert() |
pub fn insert(&mut self, k: K, v: V) → Option キー/値のペアを挿入します。キーがない場合はNoneが返されます。 更新後、古い値が返されます。 |
2 | len() |
pub fn len(&self) → usize マップ内の要素の数を返します。 |
3 | get() |
pub fn get<Q: ?Sized>(&lself, k: &Q) → Option<&V> where K:Borrow Q:Hash+ Eq キーに対応する値への参照を返します。 |
4 | iter() |
pub fn iter(&self) → Iter<K, V> 任意の順序ですべてのキーと値のペアを訪問する反復子。 反復子要素のタイプは(& 'a K、&' a V)です。 |
5 | contains_key |
pub fn contains_key<Q: ?Sized>(&self, k: &Q) → bool マップに指定されたキーの値が含まれている場合、trueを返します。 |
6 | remove() |
pub fn remove_entry<Q: ?Sized>(&mut self, k: &Q) → Option<(K, V)> マップからキーを削除し、キーが以前マップにあった場合、保存されたキーと値を返します。 |
イラスト:insert()
HashMapにキー/値のペアを挿入します。
use std::collections::HashMap;
fn main(){
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("{:?}",stateCodes);
}
上記のプログラムはHashMapを作成し、2つのキーと値のペアで初期化します。
出力
{"KL": "Kerala", "MH": "Maharashtra"}
イラスト:len()
マップ内の要素の数を返します
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("size of map is {}",stateCodes.len());
}
上記の例では、HashMapを作成し、その中の要素の総数を出力します。
出力
size of map is 2
イラスト-get()
キーに対応する値への参照を返します。 次の例では、HashMapのキー_KL_の値を取得します。
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
println!("size of map is {}",stateCodes.len());
println!("{:?}",stateCodes);
match stateCodes.get(&"KL") {
Some(value)=> {
println!("Value for key KL is {}",value);
}
None => {
println!("nothing found");
}
}
}
出力
size of map is 2
{"KL": "Kerala", "MH": "Maharashtra"}
Value for key KL is Kerala
イラスト-iter()
任意の順序ですべてのキーと値のペアへの参照を含む反復子を返します。
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
for (key, val) in stateCodes.iter() {
println!("key: {} val: {}", key, val);
}
}
出力
key: MH val: Maharashtra
key: KL val: Kerala
イラスト:contains_key()
マップに指定されたキーの値が含まれている場合、trueを返します。
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
stateCodes.insert("GJ","Gujarat");
if stateCodes.contains_key(&"GJ") {
println!("found key");
}
}
出力
found key
イラスト:remove()
マップからキーを削除します。
use std::collections::HashMap;
fn main() {
let mut stateCodes = HashMap::new();
stateCodes.insert("KL","Kerala");
stateCodes.insert("MH","Maharashtra");
stateCodes.insert("GJ","Gujarat");
println!("length of the hashmap {}",stateCodes.len());
stateCodes.remove(&"GJ");
println!("length of the hashmap after remove() {}",stateCodes.len());
}
出力
length of the hashmap 3
length of the hashmap after remove() 2
ハッシュセット
- HashSetは、タイプTの一意の値のセットです。 値の追加と削除は高速で、特定の値がセットに含まれているかどうかを尋ねるのは高速です。 HashSet構造は、std
- collectionsモジュールで定義されています。 HashSet構造にアクセスするには、このモジュールを明示的にインポートする必要があります。
構文:ハッシュセットの作成
let mut hash_set_name = HashSet::new();
HashSet構造の静的メソッド_new_は、HashSetの作成に使用されます。 このメソッドは、空のHashSetを作成します。
次の表に、HashSet構造体で一般的に使用されるメソッドの一部を示します。
Sr.No | Method | Signature & Description |
---|---|---|
1 | insert() |
pub fn insert(&mut self, value: T) → bool セットに値を追加します。 セットにこの値が存在しない場合はtrueが返され、そうでない場合はfalseが返されます。 |
2 | len() |
pub fn len(&self) → usize セット内の要素の数を返します。 |
3 | get() |
pub fn get<Q:?Sized>(&self, value: &Q) → Option<&T> where T: Borrow,Q: Hash + Eq, 指定された値と等しい場合、セット内の値への参照を返します。 |
4 | iter() |
pub fn iter(&self) → Iter 任意の順序ですべての要素を訪問する反復子を返します。 反復子要素のタイプは& 'a Tです。 |
5 | contains_key |
pub fn contains<Q: ?Sized>(&self, value: &Q) → bool セットに値が含まれる場合、trueを返します。 |
6 | remove() |
pub fn remove<Q: ?Sized>(&mut self, value: &Q) → bool セットから値を削除します。 値がセットに存在した場合、trueを返します。 |
イラスト-insert()
セットに値を追加します。 HashSetは、重複した値をコレクションに追加しません。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
names.insert("Mohtashim");//duplicates not added
println!("{:?}",names);
}
出力
{"finddevguides", "Kannan", "Mohtashim"}
イラスト:len()
セット内の要素の数を返します。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
println!("size of the set is {}",names.len());
}
出力
size of the set is 3
イラスト-iter()
任意の順序ですべての要素を訪問する反復子を返します。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
names.insert("Mohtashim");
for name in names.iter() {
println!("{}",name);
}
}
出力
finddevguides
Mohtashim
Kannan
イラスト:get()
指定された値に等しいセット内の値(存在する場合)への参照を返します。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
names.insert("Mohtashim");
match names.get(&"Mohtashim"){
Some(value)=>{
println!("found {}",value);
}
None =>{
println!("not found");
}
}
println!("{:?}",names);
}
出力
found Mohtashim
{"Kannan", "Mohtashim", "finddevguides"}
イラスト-含む()
セットに値が含まれる場合、trueを返します。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
if names.contains(&"Kannan") {
println!("found name");
}
}
出力
found name
イラスト:remove()
セットから値を削除します。
use std::collections::HashSet;
fn main() {
let mut names = HashSet::new();
names.insert("Mohtashim");
names.insert("Kannan");
names.insert("finddevguides");
println!("length of the Hashset: {}",names.len());
names.remove(&"Kannan");
println!("length of the Hashset after remove() : {}",names.len());
}
出力
length of the Hashset: 3
length of the Hashset after remove() : 2