【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
と比べて先頭への操作が高速であり、キューやスタックとしても活用できる便利なコンテナです。