Rust のキューおよびスタック コレクション
この記事は、Rust におけるキュー コレクションとスタック コレクションの存在について説明しています。
さびコレクション
Rust の標準コレクション ライブラリには、汎用プログラミングで最も頻繁に使用されるデータ構造の効率的な実装が含まれています。 その結果、標準の実装を使用する場合、2つのライブラリは多くのデータ変換を必要とせずに通信できるはずです。
まず、おそらく Vec
を使用する必要があります。 これら 2つのコレクションは、汎用データのほとんどのストレージおよび処理シナリオをカバーしています。
彼らは自分の仕事に優れています。 標準ライブラリの他のすべてのコレクションには、最適な選択となる特定のユース ケースがありますが、これらのユース ケースはニッチです。
Vec
と HashMap
が技術的に劣っていたとしても、それらはおそらく十分な出発点です。
Rust で利用可能なコレクションは、以下の 4つの主要なカテゴリにグループ化できます。
- シーケンス:
Vec
、VecDeque
、LinkedList
- マップ:
HashMap
,BTreeMap
- セット:
HashSet
、BTreeSet
- その他:
BinaryHeap
ラストキュー
Rust のキュー データ構造は、要素を格納するために使用されます。 Rust のキューは、先入れ先出しを意味する FIO 方式で動作します。
これは、Rust コレクション ライブラリに含まれている標準キューです。 これは線形データ構造です。
キューは、それを操作するために使用できるいくつかの操作を提供します。 任意の数の要素を含めることができます。 実装全体は、Rust のベクトル データ構造に基づいています。
構文:
let mut variable_name : Queue<queue_size> = queue![];
錆びたスタック
スタックは、追加および削除できるアイテムのコレクションですが、次の順序でのみ可能です: 後入れ先出し
(LIFO)。 たとえば、満員電車に乗った場合、他の乗客が同様に降りるために、自分が最初に降りる必要があります。
オブジェクトの追加は通常 push
と呼ばれ、商品の削除は通常 pop
と呼ばれます。これは、これらの関数が Vec
(ベクトル) データ構造を使用して Rust に実装されているためです。
新しいスタックを作成するには、次の構文を使用できます。
let s = Stack { stack: Vec::new() };
Rust は、標準ライブラリに要素を追加するための保証されたレイテンシを備えたライブラリを提供しません。 Rust コレクションに要素を追加すると、メモリが割り当てられる場合があります。
最悪の場合、メモリの割り当てに無限の時間がかかることがあります。
いずれの場合も、候補は 2つあります。
- スタックは、
Vec
またはLinkedList
のいずれかの上に実装できます。どちらもpop back
とpush back
をサポートしているためです。 - キューは、
VecDeque
またはLinkedList
のいずれかの上に実装できます。これは、どちらもpop front
とpush back
をサポートするためです。
Vec
と LinkedList
にはいくつかの違いがあります。 後者はより単純です: push back
の呼び出しごとにメモリが割り当てられます。
一方では、プッシュバック
のコストはコレクション内に既にあるオブジェクトの数とは無関係であるため、これは有利です。 それでも一方で、メモリの割り当てには時間がかかる場合があります。
前者は、次の理由により、もう少し複雑です。
- キャッシュフレンドリーな性質により、スループットが高くなります。
- 追加の容量があり、余分な容量がある限り
プッシュバック
が割り当てられないようにします。 超過容量が事前に予約されていない場合でも、償却されたO(1)
プッシュバック
を維持します。
スタックには Vec
を、キューには VecDeque
を使用することをお勧めします。