【C++学習|豆知識】vectorにはない武器!std::dequeで先頭操作をスマートに行う方法

1. 導入:なぜstd::dequeが必要なのか

C++で配列を扱う際、真っ先に思い浮かぶのはstd::vectorでしょう。しかし、std::vectorは「末尾への追加・削除」には強いものの、「先頭への追加・削除」には非常に時間がかかるという弱点があります。先頭に要素を追加しようとすると、既存のすべての要素を一つずつ後ろにずらす必要があるからです。この課題を解決し、先頭と末尾の両方に対して高速な操作を可能にするのが、今回紹介するstd::deque(ダブルエンドキュー)です。

2. 基礎知識:std::dequeの仕組み

std::dequeは「Double Ended Queue」の略称です。内部的には複数のメモリブロック(チャンク)を連結して管理しており、先頭や末尾へのアクセスが定数時間(O(1))で行えるように設計されています。std::vectorのようにメモリを再確保して全要素をコピーし直す必要がないため、キューやスタックのようなデータ構造を実装する際に非常に重宝します。

3. 実装と解決策

std::dequeで先頭を操作するには、push_front()pop_front()を使用します。使い方は非常にシンプルで、コンテナの先頭に対して直接要素を挿入したり、取り除いたりすることができます。

4. サンプルプログラム

以下のコードをコピーして、実際にstd::dequeの動作を確認してみてください。

include
include

int main() {
// dequeの初期化
std::deque dq = {10, 20, 30};

// 先頭に要素を追加
dq.push_front(5);

// 先頭から要素を削除
dq.pop_front();

// 現在の要素を出力
std::cout << "現在のdequeの内容: "; for (int n : dq) { std::cout << n << " "; } std::cout << std::endl; return 0; }

5. 応用・注意点:現場で役立つアドバイス

std::dequeは便利ですが、すべての状況でstd::vectorより優れているわけではありません。以下の点に注意してください。

・メモリの連続性
std::vectorと異なり、std::dequeの要素はメモリ上で完全に連続しているとは限りません。そのため、C言語のAPIに配列として渡すような使い方はできません。

・パフォーマンスのトレードオフ
先頭や末尾以外の「真ん中」への挿入・削除は、std::vectorよりも遅くなる傾向があります。先頭・末尾の操作が頻繁に発生する場合にのみ、std::dequeを選択するのがベストプラクティスです。

まずは、キューのような挙動が必要なアルゴリズムで、std::vectorの代わりにstd::dequeを試してみてください。コードの可読性とパフォーマンスが劇的に向上するはずです。

コメント

タイトルとURLをコピーしました