[解決済み] なぜstd::stackはデフォルトでstd::dequeを使うのですか?
疑問点
スタックで使用するコンテナに必要な操作は、以下の通りであるため。
- back()
- push_back()
- pop_back()
なぜデフォルトのコンテナはvectorではなくdequeなのでしょうか?
deque の再割り当ては、front() の前に要素のバッファを与えるので、push_front() は効率的な操作にならないのでしょうか? これらの要素はスタックのコンテキストで決して使用されることがないので、無駄ではないですか?
もし、vector の代わりに deque をこの方法で使用してもオーバーヘッドがないのであれば、なぜ priority_queue のデフォルトは deque ではなく vector なのでしょうか? (priority_queue は front(), push_back(), pop_back() を必要とします - 基本的にスタックと同じです)。
以下の回答を元に更新しました。
dequeの実装方法は、通常、固定サイズの配列を可変サイズにしたもののようです。これはベクター(再割り当てとコピーが必要)よりも高速に成長するので、要素の追加と削除がすべてであるスタックのようなものには、おそらくdequeがより良い選択です。
priority_queue は、削除と挿入のたびに pop_heap() または push_heap() を実行する必要があるため、インデックス付けが非常に必要です。これはおそらく、要素を追加することがとにかくまだ償却された定数であるので、そこではvectorがより良い選択となります。
どのように解決するのですか?
コンテナが成長すると、vector の再割り当てでは、すべての要素を新しいメモリブロックにコピーする必要があります。 deque を成長させると、新しいブロックが割り当てられ、ブロックのリストにリンクされます - コピーは必要ありません。
もちろん、必要であれば、異なるバッキングコンテナを使用するように指定することができます。 スタックがあまり大きくならないことがわかっている場合、dequeの代わりにvectorを使用するように指定します。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件