Rust-collections

提供:Dev Guides
移動先:案内検索

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()
  • pub fn new()→Vect*

新しい空の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