C++ STL 容器技術 之 deque雙端隊列容器

來源:互聯網
上載者:User

簡介:

deque雙端隊列容器(double-ended queue)與vector非常相似,演算法的時間複雜度也是常數階O(1),deque內部的資料機制和執行效能與vector不同,一般說來,當考慮到容器元素的記憶體配置策略和操作的效能時,deque相對vector較為有優勢。deque雙端隊列採用分塊的線性結構來儲存資料,具有高效的刪除首尾元素的函數,由於deque容器是以deque塊為單位進行記憶體的分配,並使用了二級的Map進行管理,因此不容易實作類別似於vector的capacity和reverse函數,而且deque容器也不需要這樣的擷取和調整容器大小的函數。

deque應用基礎:

建立deque對象:

1、deque() 建立一個空的deque對象。

如:deque<int> d;

2、deque(size_type n) 建立一個具有n個元素的deque對象,每個deque元素具有它的類型下的預設值。

如:deque<int> d(10);

3、deque(size_type n, const T& value) 建立一個具有n個元素的deque對象,每個元素具有初始值value。

如:deque<int> d(10, 5);

4、deque(const deque&) 通過拷貝一個deque對象的各個元素值,建立一個新的deque對象。

如:deque<int> d1(10, 5);        deque<int> d2(d1);

5、deque(const InputIterator first, const InputIterator last, const A& a=A()) 通過拷貝迭代器區間[first, last)的元素值,建立一個新的deque對象中,記憶體 Clerk可省略。

如:int iArray[] = {1,2,3};      deque<int> d(iArray, iArray+3);

初始化賦值:

deque提供的push_back函數常用來進行deque容器的初始化,push_back函數在容器的尾端插入新元素value。

void push_back(const T&)

元素的遍曆訪問:

deque的元素可採用數組或迭代器的方式進行遍曆訪問。

元素的插入:

由於deque使用了兩個迭代器分別指向雙端隊列的首尾,因此deque具有高效的頭部插入元素的函數push_front()

void push_front(const T&)

其它位置的插入,將涉及相關元素的移位拷貝,insert函數的一個較常用的原型為:

iterator insert(iterator pos, const T& x)

元素的刪除:

void pop_front() 刪除deque的第一個元素

void pop_back() 刪除deque的最後一個元素

iterator erase(iterator pos) 刪除迭代器pos所指的元素

iterator erase(iterator first, iterator last) 刪除迭代器區間[first, last)的所有元素

void clear() 調用erase函數,清除所有元素

元素的反向遍曆:

reverse_iterator rbegin()

reverse_iterator rend()

deque的交換:

void swap(deque&)

其它常用函數:

bool empty()

size_type size()

size_type max_size()

reference front()

reference back()

舉例分析:

1、

//用數組的方式訪問deque元素#include <iostream>#include <deque>using namespace std;int main(void){deque<int> d;d.push_back(13);d.push_back(32);d.push_back(29);for (int i=0; i<d.size(); i++){   cout << "d[" << i << "] = " << d[i] << endl;}return 0;}

2、

//用迭代器訪問deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<string> d;d.push_back("a");d.push_back("b");d.push_back("c");deque<string>::iterator i, iend;iend = d.end();int j;for (i=d.begin(),j=0; i!=iend; i++,j++){   cout << *i << " ";}cout << endl;return 0;}

3、

//頭部和中間位置插入deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(6);d.push_back(7);  //頭部插入d.push_front(5);for (int i=0; i<d.size(); i++){   cout << d[i] << " ";}cout << endl;//中間位置插入d.insert(d.begin()+1, 9);for (int j=0; j<d.size(); j++){   cout << d[j] << ' ';}cout << endl;return 0;}

4、

//頭尾和其它位置刪除deque元素#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(4);d.push_back(5);d.push_back(3);d.push_back(3);d.push_back(3);d.push_back(6);for (int i=0; i<d.size(); i++){   cout << d[i] << ' ' ;}cout << endl;//頭尾和任意位置刪除元素d.erase(d.begin()+1);d.pop_front();d.pop_back();for (int j=0; j<d.size(); j++){   cout << d[j] << ' ' ;}cout << endl;//刪除所有元素d.clear();cout << "執行clear()" << endl << "deque元素全部清除" << endl;return 0;}

5、

//deque元素的反向遍曆#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(1);   d.push_back(3);d.push_back(5);d.push_back(7);d.push_back(9);//deque元素的前向遍曆deque<int>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){   cout << *i << " ";}cout << endl;//deque元素的反向遍曆deque<int>::reverse_iterator ri, riend;riend = d.rend();for (ri=d.rbegin(); ri!=riend; ri++){   cout << *ri << " ";}cout << endl;return 0;} 

//deque元素的反向遍曆#include <deque>#include <iostream>using namespace std;int main(void){deque<int> d;d.push_back(1);   d.push_back(3);d.push_back(5);d.push_back(7);d.push_back(9);//deque元素的前向遍曆deque<int>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){   cout << *i << " ";}cout << endl;//deque元素的反向遍曆deque<int>::reverse_iterator ri, riend;riend = d.rend();for (ri=d.rbegin(); ri!=riend; ri++){   cout << *ri << " ";}cout << endl;return 0;} 

6、

//兩個deque容器的元素交換#include <deque>#include <iostream>using namespace std;void print(deque<int>& d){for (int i=0; i<d.size(); i++){   cout << d[i] << " ";}cout << endl;}int main(void){deque<int> d1;d1.push_back(11);d1.push_back(12);d1.push_back(13);cout << "d1 = ";print(d1);deque<int> d2;d2.push_back(90);d2.push_back(91);d2.push_back(92);cout << "d2 = ";print(d2);//d1和d2交換d1.swap(d2);cout << "d1與d2交換後" << endl;cout << "d1 = ";print(d1);cout << "d2 = ";print(d2);return 0;}

7、

//deque其它常用函數的使用#include <deque>#include <iostream>using namespace std;int main(void){deque<string> d;//列印deque為空白cout << "d是否為空白: " << d.empty() << endl;//裝入元素d.push_back("紅樓夢");d.push_back("源氏物語");d.push_back("教父");d.push_back("水滸傳");d.push_back("24史");//列印deque所有元素deque<string>::iterator i, iend;iend = d.end();for (i=d.begin(); i!=iend; i++){   cout << *i << " ";}cout << endl;//列印首元素cout << "deque首元素為: " << d.front() << endl;//列印末元素cout << "deque末元素為: " << d.back() << endl;//列印元素個數cout << "deque元素個數為: " << d.size() << endl;//列印可支援的最大deque元素個數cout << "deque最大元素個數為: " << d.max_size() << endl;return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.