C ++両端キューデック[C ++ STL]デック使用コメント

詳述[C ++ STL]デック用途

 

 


I.概要

両端キュー(両端キュー)が連続した領域の定量のセクションで構成され、そのように両方の迅速テール又はヘッド要素に配置され、端部に発生し得ます。他の要素が移動しなければならないので、中間部に配置要素は、比較的時間がかかります。


第二に、定義と初期化

対応するヘッダファイルを使用する前に容器に添加されなければなりません。

#include <deque> // deque属于std命名域的,因此需要通过命名限定,例如using std::deque;

次のように定義されたコードは次のとおりです。

deque<int> a; // 定义一个int类型的双端队列a
deque<int> a(10); // 定义一个int类型的双端队列a,并设置初始大小为10 deque<int> a(10, 1); // 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1 deque<int> b(a); // 定义并用双端队列a初始化双端队列b deque<int> b(a.begin(), a.begin()+3); // 将双端队列a中从第0个到第2个(共3个)作为双端队列b的初始值 

また、あなたはまた、初期化ベクトルを指示するために、配列を使用することができます。

int n[] = { 1, 2, 3, 4, 5 }; // 将数组n的前5个元素作为双端队列a的初值 // 说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素, // 这个主要是为了和deque.end()指针统一。 deque<int> a(n, n + 5); deque<int> a(&n[1], &n[4]); // 将n[1]、n[2]、n[3]作为双端队列a的初值 

第三に、基本的な操作機能

3.1容量の機能

  • コンテナサイズ:deq.size();
  • コンテナの最大容量:deq.max_size();
  • コンテナのサイズを変更します。deq.resize();
  • 空の容器文:deq.empty();
  • 要素によって占められるストレージスペースのサイズを満たすために、コンテナのサイズを小さくします:deq.shrink_to_fit();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i<6; i++) { deq.push_back(i); } cout << deq.size() << endl; // 输出:6 cout << deq.max_size() << endl; // 输出:1073741823 deq.resize(0); // 更改元素大小 cout << deq.size() << endl; // 输出:0 if (deq.empty()) cout << "元素为空" << endl; // 输出:元素为空 return 0; } 

3.2の追加機能

  • ヘッドは、要素を追加しました:deq.push_front(const T& x);
  • 最後に要素を追加します。deq.push_back(const T& x);
  • どこかの要素を挿入します。deq.insert(iterator it, const T& x);
  • どこでもn個の同一の要素を挿入します:deq.insert(iterator it, int n, const T& x);
  • データ間の別のベクトル[フォースト、最後]に:deq.insert(iterator it, iterator first, iterator last);
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; // 头部增加元素 deq.push_front(4); // 末尾添加元素 deq.push_back(5); // 任意位置插入一个元素 deque<int>::iterator it = deq.begin(); deq.insert(it, 2); // 任意位置插入n个相同元素 it = deq.begin(); // 必须要有这句 deq.insert(it, 3, 9); // 插入另一个向量的[forst,last]间的数据 deque<int> deq2(5,8); it = deq.begin(); // 必须要有这句 deq.insert(it, deq2.end() - 1, deq2.end()); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; // 输出:8 9 9 9 2 4 5 cout << endl; return 0; } 

3.3削除機能

  • ヘッド削除要素:deq.pop_front();
  • 削除の要素を終了します。deq.pop_back();
  • どこかの要素を削除します。deq.erase(iterator it);
  • [、最初の最後]の間の要素を削除します。deq.erase(iterator first, iterator last);
  • すべての要素をクリアします。deq.clear();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i < 8; i++) deq.push_back(i); // 头部删除元素 deq.pop_front(); // 末尾删除元素 deq.pop_back(); // 任意位置删除一个元素 deque<int>::iterator it = deq.begin(); deq.erase(it); // 删除[first,last]之间的元素 deq.erase(deq.begin(), deq.begin()+1); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; cout << endl; // 清空所有元素 deq.clear(); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; // 输出:3 4 5 6 cout << endl; return 0; } 

3.4アクセス関数

  • インデックス付きアクセス:deq[1]; //とクロスボーダーをチェックしません。
  • アクセスの方法で:deq.at(1); 2の間の差は、少なくともクロスボーダーのための//チェックは、例外が範囲外スローされますされています
  • 最初の要素にアクセスします。deq.front();
  • 最後の要素にアクセスします。deq.back();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i < 6; i++) deq.push_back(i); // 下标访问 cout << deq[0] << endl; // 输出:0 // at方法访问 cout << deq.at(0) << endl; // 输出:0 // 访问第一个元素 cout << deq.front() << endl; // 输出:0 // 访问最后一个元素 cout << deq.back() << endl; // 输出:5 return 0; } 

3.5その他の機能

  • 複数の要素の割り当て:deq.assign(int nSize, const T& x); 初期化と同様の配列//と代入
  • コンテナの同じタイプの2つのスイッチング素子:swap(deque&);
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { // 多个元素赋值 deque<int> deq; deq.assign(3, 1); deque<int> deq2; deq2.assign(3, 2); // 交换两个容器的元素 deq.swap(deq2); // 遍历显示 cout << "deq: "; for (int i = 0; i < deq.size(); i++) cout << deq[i] << " "; // 输出:2 2 2 cout << endl; // 遍历显示 cout << "deq2: "; for (int i = 0; i < deq2.size(); i++) cout << deq2[i] << " "; // 输出:1 1 1 cout << endl; return 0; } 

第四に、イテレータとアルゴリズム

1.イテレータ

  • ポインタを反復:deq.begin();
  • イテレータ終了ポインタ:deq.end(); 最後の要素の次の位置に//ポイント
  • イテレータは定数ポインタの先頭を指している:deq.cbegin(); 彼らは内容を変更するには、このポインタを渡すことができないことを//手段と呼ばれていますが、変更したり、他の手段によって、また、ポインタを移動することができます。
  • 定数の最後まで反復子ポインタポイント:deq.cend();
  • イテレータは、最後の要素へのポインタを逆:deq.rbegin();
  • 反復子は、最初の要素の前の要素へのポインタを逆:deq.rend();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; deq.push_back(1); deq.push_back(2); deq.push_back(3); cout << *(deq.begin()) << endl; // 输出:1 cout << *(--deq.end()) << endl; // 输出:3 cout << *(deq.cbegin()) << endl; // 输出:1 cout << *(--deq.cend()) << endl; // 输出:3 cout << *(deq.rbegin()) << endl; // 输出:3 cout << *(--deq.rend()) << endl; // 输出:1 cout << endl; return 0; } 

2.アルゴリズム

  • トラバース要素
deque<int>::iterator it;
for (it = deq.begin(); it != deq.end(); it++)
    cout << *it << endl; // 或者 for (int i = 0; i < deq.size(); i++) { cout << deq.at(i) << endl; } 

  • フリップ要素
#include <algorithm>
reverse(deq.begin(), deq.end());

  • 並び替え要素
#include <algorithm>
sort(deq.begin(), deq.end()); // 采用的是从小到大的排序

// 如果想从大到小排序,可以采用先排序后反转的方式,也可以采用下面方法: // 自定义从大到小的比较器,用来改变排序方式 bool Comp(const int& a, const int& b) { return a > b; } sort(deq.begin(), deq.end(), Comp); 

V.の概要

あなたが見ることができ、両端キューとベクトルの使用量は、以下のいくつかの違いを除いて、基本的に同じです。

  • いかなる容量()関数、およびベクトルたが両端キューありません。
  • そこpush_frontデック()とpop_front()関数で、無ベクター;
  • 何のデータを両端キューません()関数、およびベクトルを持っています。

 


I.概要

両端キュー(両端キュー)が連続した領域の定量のセクションで構成され、そのように両方の迅速テール又はヘッド要素に配置され、端部に発生し得ます。他の要素が移動しなければならないので、中間部に配置要素は、比較的時間がかかります。


第二に、定義と初期化

対応するヘッダファイルを使用する前に容器に添加されなければなりません。

#include <deque> // deque属于std命名域的,因此需要通过命名限定,例如using std::deque;

次のように定義されたコードは次のとおりです。

deque<int> a; // 定义一个int类型的双端队列a
deque<int> a(10); // 定义一个int类型的双端队列a,并设置初始大小为10 deque<int> a(10, 1); // 定义一个int类型的双端队列a,并设置初始大小为10且初始值都为1 deque<int> b(a); // 定义并用双端队列a初始化双端队列b deque<int> b(a.begin(), a.begin()+3); // 将双端队列a中从第0个到第2个(共3个)作为双端队列b的初始值 

また、あなたはまた、初期化ベクトルを指示するために、配列を使用することができます。

int n[] = { 1, 2, 3, 4, 5 }; // 将数组n的前5个元素作为双端队列a的初值 // 说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素, // 这个主要是为了和deque.end()指针统一。 deque<int> a(n, n + 5); deque<int> a(&n[1], &n[4]); // 将n[1]、n[2]、n[3]作为双端队列a的初值 

第三に、基本的な操作機能

3.1容量の機能

  • コンテナサイズ:deq.size();
  • コンテナの最大容量:deq.max_size();
  • コンテナのサイズを変更します。deq.resize();
  • 空の容器文:deq.empty();
  • 要素によって占められるストレージスペースのサイズを満たすために、コンテナのサイズを小さくします:deq.shrink_to_fit();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i<6; i++) { deq.push_back(i); } cout << deq.size() << endl; // 输出:6 cout << deq.max_size() << endl; // 输出:1073741823 deq.resize(0); // 更改元素大小 cout << deq.size() << endl; // 输出:0 if (deq.empty()) cout << "元素为空" << endl; // 输出:元素为空 return 0; } 

3.2の追加機能

  • ヘッドは、要素を追加しました:deq.push_front(const T& x);
  • 最後に要素を追加します。deq.push_back(const T& x);
  • どこかの要素を挿入します。deq.insert(iterator it, const T& x);
  • どこでもn個の同一の要素を挿入します:deq.insert(iterator it, int n, const T& x);
  • データ間の別のベクトル[フォースト、最後]に:deq.insert(iterator it, iterator first, iterator last);
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; // 头部增加元素 deq.push_front(4); // 末尾添加元素 deq.push_back(5); // 任意位置插入一个元素 deque<int>::iterator it = deq.begin(); deq.insert(it, 2); // 任意位置插入n个相同元素 it = deq.begin(); // 必须要有这句 deq.insert(it, 3, 9); // 插入另一个向量的[forst,last]间的数据 deque<int> deq2(5,8); it = deq.begin(); // 必须要有这句 deq.insert(it, deq2.end() - 1, deq2.end()); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; // 输出:8 9 9 9 2 4 5 cout << endl; return 0; } 

3.3削除機能

  • ヘッド削除要素:deq.pop_front();
  • 削除の要素を終了します。deq.pop_back();
  • どこかの要素を削除します。deq.erase(iterator it);
  • [、最初の最後]の間の要素を削除します。deq.erase(iterator first, iterator last);
  • すべての要素をクリアします。deq.clear();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i < 8; i++) deq.push_back(i); // 头部删除元素 deq.pop_front(); // 末尾删除元素 deq.pop_back(); // 任意位置删除一个元素 deque<int>::iterator it = deq.begin(); deq.erase(it); // 删除[first,last]之间的元素 deq.erase(deq.begin(), deq.begin()+1); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; cout << endl; // 清空所有元素 deq.clear(); // 遍历显示 for (it = deq.begin(); it != deq.end(); it++) cout << *it << " "; // 输出:3 4 5 6 cout << endl; return 0; } 

3.4アクセス関数

  • インデックス付きアクセス:deq[1]; //とクロスボーダーをチェックしません。
  • アクセスの方法で:deq.at(1); 2の間の差は、少なくともクロスボーダーのための//チェックは、例外が範囲外スローされますされています
  • 最初の要素にアクセスします。deq.front();
  • 最後の要素にアクセスします。deq.back();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; for (int i = 0; i < 6; i++) deq.push_back(i); // 下标访问 cout << deq[0] << endl; // 输出:0 // at方法访问 cout << deq.at(0) << endl; // 输出:0 // 访问第一个元素 cout << deq.front() << endl; // 输出:0 // 访问最后一个元素 cout << deq.back() << endl; // 输出:5 return 0; } 

3.5その他の機能

  • 複数の要素の割り当て:deq.assign(int nSize, const T& x); 初期化と同様の配列//と代入
  • コンテナの同じタイプの2つのスイッチング素子:swap(deque&);
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { // 多个元素赋值 deque<int> deq; deq.assign(3, 1); deque<int> deq2; deq2.assign(3, 2); // 交换两个容器的元素 deq.swap(deq2); // 遍历显示 cout << "deq: "; for (int i = 0; i < deq.size(); i++) cout << deq[i] << " "; // 输出:2 2 2 cout << endl; // 遍历显示 cout << "deq2: "; for (int i = 0; i < deq2.size(); i++) cout << deq2[i] << " "; // 输出:1 1 1 cout << endl; return 0; } 

第四に、イテレータとアルゴリズム

1.イテレータ

  • ポインタを反復:deq.begin();
  • イテレータ終了ポインタ:deq.end(); 最後の要素の次の位置に//ポイント
  • イテレータは定数ポインタの先頭を指している:deq.cbegin(); 彼らは内容を変更するには、このポインタを渡すことができないことを//手段と呼ばれていますが、変更したり、他の手段によって、また、ポインタを移動することができます。
  • 定数の最後まで反復子ポインタポイント:deq.cend();
  • イテレータは、最後の要素へのポインタを逆:deq.rbegin();
  • 反復子は、最初の要素の前の要素へのポインタを逆:deq.rend();
#include <iostream>
#include <deque> using namespace std; int main(int argc, char* argv[]) { deque<int> deq; deq.push_back(1); deq.push_back(2); deq.push_back(3); cout << *(deq.begin()) << endl; // 输出:1 cout << *(--deq.end()) << endl; // 输出:3 cout << *(deq.cbegin()) << endl; // 输出:1 cout << *(--deq.cend()) << endl; // 输出:3 cout << *(deq.rbegin()) << endl; // 输出:3 cout << *(--deq.rend()) << endl; // 输出:1 cout << endl; return 0; } 

2.アルゴリズム

  • トラバース要素
deque<int>::iterator it;
for (it = deq.begin(); it != deq.end(); it++)
    cout << *it << endl; // 或者 for (int i = 0; i < deq.size(); i++) { cout << deq.at(i) << endl; } 

  • フリップ要素
#include <algorithm>
reverse(deq.begin(), deq.end());

  • 並び替え要素
#include <algorithm>
sort(deq.begin(), deq.end()); // 采用的是从小到大的排序

// 如果想从大到小排序,可以采用先排序后反转的方式,也可以采用下面方法: // 自定义从大到小的比较器,用来改变排序方式 bool Comp(const int& a, const int& b) { return a > b; } sort(deq.begin(), deq.end(), Comp); 

V.の概要

あなたが見ることができ、両端キューとベクトルの使用量は、以下のいくつかの違いを除いて、基本的に同じです。

  • いかなる容量()関数、およびベクトルたが両端キューありません。
  • そこpush_frontデック()とpop_front()関数で、無ベクター;
  • 何のデータを両端キューません()関数、およびベクトルを持っています。

おすすめ

転載: www.cnblogs.com/elvisHuster/p/12584537.html