【C++】std::dequeで出来ることと使い方【標準ライブラリ】

【C++】std::dequeで出来ることと使い方【標準ライブラリ】

std::dequeとは

std::deque(double-ended queue、デキュー)は、C++標準ライブラリのコンテナの一つであり、両端から高速に要素を追加・削除できるのが特徴です。

内部的にはstd::vectorのような連続メモリではなく、複数のメモリブロックを持つ構造になっており、先頭や末尾の操作が効率的に行えます。

基本的な使い方

#include <deque> をインクルードすることで使用できます。

#include <iostream>
#include <deque>

int main() {
    std::deque dq = {1, 2, 3, 4, 5};

    for (int x : dq) {
        std::cout << x << " ";
    }
    return 0;
}

要素へのアクセス

std::dequeでは以下の方法で要素にアクセスできます。

  • operator[]: インデックスで要素にアクセス
  • at(): 範囲外アクセス時に例外を投げる
  • front(): 先頭要素を取得
  • back(): 末尾要素を取得
#include <iostream>
#include <deque>

int main() {
    std::deque dq = {10, 20, 30, 40};

    std::cout << "dq[1]: " << dq[1] << std::endl; 
    std::cout << "dq.at(2): " << dq.at(2) << std::endl;
    std::cout << "Front: " << dq.front() << std::endl;
    std::cout << "Back: " << dq.back() << std::endl;

    return 0;
}

要素の追加・削除

std::dequeの最大の強みは、先頭と末尾の両方に対する効率的な追加・削除です。

#include <iostream>
#include <deque>

int main() {
    std::deque dq;

    // 末尾への追加
    dq.push_back(10);
    dq.push_back(20);

    // 先頭への追加
    dq.push_front(5);
    
    // 末尾の削除
    dq.pop_back();
    
    // 先頭の削除
    dq.pop_front();

    return 0;
}

イテレータの使い方

std::dequeはイテレータを使用して要素を操作できます。

#include <iostream>
#include <deque>

int main() {
    std::deque dq = {10, 20, 30, 40};

    // 通常のイテレータ
    for (auto it = dq.begin(); it != dq.end(); ++it) {
        std::cout << *it << " ";
    }

    std::cout << std::endl;

    // 逆イテレータ
    for (auto rit = dq.rbegin(); rit != dq.rend(); ++rit) {
        std::cout << *rit << " ";
    }

    return 0;
}

std::vectorとの比較

機能 std::vector std::deque
要素の追加・削除(末尾) 高速 高速
要素の追加・削除(先頭) 低速(全体のシフトが必要) 高速
ランダムアクセス 高速 やや遅い(内部構造による)

高度な使い方

std::dequeの活用例として、キューやスタックの代替が挙げられます。

スタックとして使用

#include <iostream>
#include <deque>

int main() {
    std::deque stack;
    
    stack.push_back(10);
    stack.push_back(20);
    
    std::cout << "Top: " << stack.back() << std::endl;
    
    stack.pop_back();
    
    return 0;
}

キューとして使用

#include <iostream>
#include <deque>

int main() {
    std::deque queue;
    
    queue.push_back(10);
    queue.push_back(20);
    
    std::cout << "Front: " << queue.front() << std::endl;
    
    queue.pop_front();
    
    return 0;
}

まとめ

std::dequeは、std::vectorと比べて先頭への操作が高速であり、キューやスタックとしても活用できる便利なコンテナです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です