web-dev-qa-db-ja.com

ベクトルとスタックの主な違いは何ですか?

どちらもスタックのように機能します。どちらにもプッシュ操作とポップ操作があります。

一部のメモリレイアウトに違いはありますか?

23
Aquarius_Girl

_std::vector_には、_std::stack_と比較していくつかのアクセシビリティおよび変更操作があります。 _std::stack_の場合、体系的な方法でのみ操作を実行する必要がある場合があります。この場合、最後の要素の上にPush()、または最後の要素にpop()を実行できます。

_std::vector_はその意味でより柔軟性があり、いくつかの操作があり、その間にinsert()またはその間にerase()を実行できます。

重要な点は、std :: stack は、基になるコンテナを提供する必要があるということです。デフォルトでは_std::deque_ですが、_std::vector_または_std::list_にすることもできます。
一方、_std::vector_は、_operator []_を使用してアクセスできる連続した配列であることが保証されています。

17
iammilind

私はすべての実装の詳細を知りませんが、 this によると、スタックはコンテナアダプターです。これにより、基になるコンテナ(ベクター、リスト、または両端キュー)がスタックとして機能するようになります。つまり、プッシュとポップのみが許可され、ランダムアクセスは許可されません。

したがって、ベクトルはスタックとして機能できますが、ランダムな位置に要素を挿入または取得できないため、スタックはベクトルとして機能できません。

13
MikMik

stackはスタックです。プッシュアンドポップのみ可能です。 vectorは、真ん中に挿入するなど、他のこともできます。これにより柔軟性が向上しますが、保証は減少します。

たとえば、スタックの場合、A、Bの順にプッシュすると、Bの順序で削除されることが保証され、次にAになります。vectorはそれを保証しません。

9
Peter Alexander

スタックは基本的にベクトルの特殊なケースです。理論的に言えば、ベクトルはあなたが望むように成長することができます。ベクトル内の任意のインデックスの要素を削除できます。ただし、スタックの場合は、要素を削除してその上部にのみ挿入できます(したがって、ベクトルの特殊なケース)。

スタックの実装を提供する多くのライブラリに直面して、それらは一般にベクトルクラス/構造から継承します。よくわかりませんが、STL(C++)で対応できると思います。

2
Ankit

cplusplus.com が示唆するように:

スタックはコンテナアダプターの一種であり、特にLIFOコンテキスト(後入れ先出し)で動作するように設計されています。要素はコンテナーの一方の端からのみ挿入および抽出されます。

ここでのキーワードはonlyであり、要素はonlyが挿入され、コンテナの一端から抽出。

ベクトルとスタックの両方がスタックのように機能すると言いますが、これは部分的にしか当てはまりません。ベクトルcanスタックのように機能しますが、任意のインデックスへの挿入、任意の要素へのアクセス、構造全体の反復などを実行できるため、スタックのようには機能しません。

スタックはコンテナ(たとえば、ベクトルなど)を取り、スタックのような相互作用のみを許可します。これにより、コンテナとのすべての対話がLIFOに従うことが効果的に保証されます。つまり、コンテナに最後に追加された要素のみにアクセスまたは削除できます。

スタックのような動作をするコンテナが必要な場合、スタックのみを動作させることが特に重要であれば、スタックを使用する必要があります。スタックのような動作が必要な場合はベクトルを使用する必要がありますが、要素を反復処理したり、任意の位置にある要素を変更したりすることもできます。

0

主な違いは、ベクトルが範囲ベースのコンテナであるということだと思います。開始や終了などのメンバー関数のおかげで簡単に使用できます。ベクトルは{}形式で簡単に開始できます。範囲ベースのループのような最新のC++の新機能を使用できます。

vector<int> vec{ 7, 3, 1, 9, 5 };
for ( auto &i : vec ) {
    std::cout << i << std::endl;
}

Std :: stackでは不可能ですが。

0
Sam Mokari