List<T>
fromSystem.Collections.Generic
はすべてのことを行いますStack<T>
が、それ以上のことを行います。これらは同じ基礎となるデータ構造に基づいています。Stack<T>
代わりに選択するのはどのような条件の下で正しいですか?
5 に答える
アイテムの後入れ先出しコレクションが必要な場合は、スタックを使用します。リストを使用すると、任意のインデックスでそのアイテムにアクセスできます。他にも多くの違いがありますが、これが最も基本的なものだと思います。
コメントの後に更新します。
Stack<T>
usingは、このコードをどのように使用したいかについての声明を出すと言えます。将来の計画を立てることは常に良いことですが、Stack<T>
今すぐ必要で、使用するやむを得ない理由がない場合List<T>
は、Stack<T>
新しいコードでスタックを使用するように人為的に制限する理由
あなたの答えがあります-使用Stack
されているデータ構造がスタックとしてのみ操作できるという契約上の期待を強制する必要がある場合に使用する必要があります。もちろん、本当にやりたいときは限られますが、必要なときに重要なツールです。
たとえば、スタックの順序が強制されない限り、処理中のデータが意味をなさないとします。そのような場合、データをリストとして利用できるようにすると、問題が発生します。a Stack
(または aQueue
またはその他の順序に依存する構造) を使用することで、コードでデータの使用方法を正確に指定できます。
Stack
論理的にスタックを表現しようとしている場合は、使用することをお勧めします。スタックを使用する場合、コード全体にプログラマーの意図を伝え、データ構造の不注意による誤用(意図せずに一方の端以外の場所に追加/削除/読み取る)を防ぎます。
Stack
具体的な実装ではなく、単なるインターフェースである可能性は確かにあります。List
次に、そのインターフェイスを実装するようなものを作成できます。そこにある問題は主に利便性の問題です。誰かがスタックを必要とする場合、具体的なタイプを単に更新するのではなく、特定の実装を選択して覚えておく必要があります(「そうそう、リストが推奨されるスタック実装です」)。
それはすべてコンセプトです。リストはリストであり、スタックはスタックであり、2 つの非常に異なることを行います。それらの唯一の共通点は、それらの一般的な性質と可変長です。
List は項目の可変長コレクションであり、インデックスによって任意の要素にアクセスして上書きすることができ、そのようなインデックスで項目を追加したり、項目を削除したりできます。
スタックは、LIFO アクセス モデルをサポートするアイテムの可変長コレクションです。スタックの最上位要素のみにアクセスでき、コレクションのその「エンドポイント」のみに要素を追加および削除できます。「上」からの項目 3 要素は、その上の 2 つの要素を「ポップ」して公開することによってのみアクセスできます。
仕事に適したツールを使用してください。コレクション内の任意の要素への「ランダムな」アクセスが必要な場合は、リストを使用します。配列内の要素へのより制限された「トップのみ」のアクセスを強制する場合は、Stack を使用します。FIFO の「パイプライン」を強制する場合はキューを使用します。アイテムは一方の端に入り、もう一方の端から出ます。
System.Collections.Generic.Stack<T>
stackとも呼ばれるLIFO (後入れ先出し) データ構造です。
その名前にもかかわらず、は[リンクされた] リストSCG.List<T>
として知られる抽象データ型ではありません。実際、これは可変長配列です。
2 つの非常に異なる生き物。