C++ 標準ライブラリ<deque>
C++では、<deque>標準テンプレートライブラリ(STL)の一部であり、両端キュー(double-ended queue)の実装を提供します。
両端キューは、両端で挿入操作と削除操作を実行できる線形データ構造です。
<deque>の正式名称は「double-ended queue」であり、C++ではテンプレートクラスとして存在し、任意のタイプのデータを格納できます。
<deque>は動的配列であり、高速なランダムアクセスを提供する一方、両端での効率的な挿入および削除操作を可能にします。これにより、<deque>頻繁な挿入と削除が必要な場面を処理するための理想的な選択肢になります。
構文
C++ で使用するには、<deque>ヘッダーファイルのインクルードが必要です。#include <deque>。以下は、<deque>の基本構文です:
#include <iostream>
#include <deque>
int main() {
std::deque<int> myDeque; // 创建一个整数类型的双端队列
// 接下来可以进行插入、删除等操作
return 0;
}
よく使う操作
以下は、std::deque コンテナのよく使うメンバ関数の一部です:
| 関数名 | 機能説明 |
|---|---|
deque() | デフォルトコンストラクタ。空のdequeコンテナを作成します。 |
deque(size_type n) | 作成:nn個のデフォルト値要素dequeを含むコンテナ。 |
deque(size_type n, const T& value) | 作成:nn個の値がvalueのvalueのdequeコンテナ。 |
deque(initializer_list<T> il) | 初期化リストを使用してil構築するdequeコンテナ。 |
operator= | 代入演算子。代入先はdequeコンテナ。 |
assign() | 新しい値で置き換えるのはdequeコンテナ内のすべての要素。 |
at(size_type pos) | 返すのはpos位置の要素で、範囲チェックを行います。 |
operator[](size_type pos) | 返すのはpos位置の要素で、範囲チェックは行いません。 |
front() | 最初の要素の参照を返します。 |
back() | 最後の要素の参照を返します。 |
begin() | 最初の要素を指すイテレータを返します。 |
end() | 末尾要素の次の位置を指すイテレータを返します。 |
rbegin() | 最後の要素を指す逆イテレータを返します。 |
rend() | 最初の要素の前の位置を指す逆イテレータを返します。 |
empty() | コンテナが空かどうかを確認します。 |
size() | コンテナ内の要素数を返します。 |
max_size() | コンテナが収容できる最大要素数を返します。 |
clear() | コンテナ内のすべての要素を消去します。 |
insert(iterator pos, const T& value) | にpos位置にvalue要素を挿入します。 |
erase(iterator pos) | 削除するのはpos位置の要素。 |
push_back(const T& value) | コンテナの末尾にvalue要素を追加します。 |
pop_back() | コンテナの末尾の要素を削除します。 |
push_front(const T& value) | コンテナの先頭にvalue要素を追加します。 |
pop_front() | コンテナの先頭の要素を削除します。 |
resize(size_type count) | コンテナのサイズをcountnに調整し、余った部分はデフォルト値で埋めます。 |
swap(deque& other) | 交換するのは、2つのdequeコンテナの内容。 |
get_allocator() | 両端キューを構築するためのアロケータオブジェクトのコピーを返します。 |
例
以下は、std::deque を<deque>使用した簡単な例で、要素の挿入、アクセス、削除操作を含みます。
例
#include <iostream>
#include <deque>
int main() {
std::deque<int> myDeque;
// 要素を挿入
myDeque.push_back(10);
myDeque.push_back(20);
myDeque.push_front(5);
// 要素にアクセス
std::cout << "Deque contains: ";
for (int i = 0; i < myDeque.size(); ++i) {
std::cout << myDeque[i] << " ";
}
std::cout << std::endl;
// 要素を削除
myDeque.pop_back();
myDeque.pop_front();
// 再度要素にアクセス
std::cout << "Deque after popping: ";
for (int i = 0; i < myDeque.size(); ++i) {
std::cout << myDeque[i] << " ";
}
std::cout << std::endl;
return 0;
}
#include <deque>
int main() {
std::deque<int> myDeque;
// 要素を挿入
myDeque.push_back(10);
myDeque.push_back(20);
myDeque.push_front(5);
// 要素にアクセス
std::cout << "Deque contains: ";
for (int i = 0; i < myDeque.size(); ++i) {
std::cout << myDeque[i] << " ";
}
std::cout << std::endl;
// 要素を削除
myDeque.pop_back();
myDeque.pop_front();
// 再度要素にアクセス
std::cout << "Deque after popping: ";
for (int i = 0; i < myDeque.size(); ++i) {
std::cout << myDeque[i] << " ";
}
std::cout << std::endl;
return 0;
}
出力結果:
Deque contains: 5 10 20 Deque after popping: 10
deque の長さが分からない場合、deque.front() と deque.back() を使用して先頭と末尾の要素にアクセスできます:
例
#include <iostream>
#include <deque>
int main() {
std::deque<int> d;
// 両端キューに要素を追加
d.push_back(10);
d.push_back(20);
d.push_front(5);
// 先頭の要素にアクセス
std::cout << "Front element: " << d.front() << std::endl;
// 末尾の要素にアクセス
std::cout << "Back element: " << d.back() << std::endl;
// 先頭の要素を変更
d.front() = 15;
// 末尾の要素を変更
d.back() = 25;
// 再度要素にアクセス
std::cout << "Modified front element: " << d.front() << std::endl;
std::cout << "Modified back element: " << d.back() << std::endl;
return 0;
}
#include <deque>
int main() {
std::deque<int> d;
// 両端キューに要素を追加
d.push_back(10);
d.push_back(20);
d.push_front(5);
// 先頭の要素にアクセス
std::cout << "Front element: " << d.front() << std::endl;
// 末尾の要素にアクセス
std::cout << "Back element: " << d.back() << std::endl;
// 先頭の要素を変更
d.front() = 15;
// 末尾の要素を変更
d.back() = 25;
// 再度要素にアクセス
std::cout << "Modified front element: " << d.front() << std::endl;
std::cout << "Modified back element: " << d.back() << std::endl;
return 0;
}
出力結果は:
Front element: 5 Back element: 20 Modified front element: 15 Modified back element: 25
注意:front() または back() を使用する前に、両端キューが空でないことを確認してください。空の場合、未定義の動作を引き起こします。両端キューが空かどうかを確認する必要がある場合は、empty() メンバ関数を使用できます。
その他の拡張