Deque 容器

一、Deque

(1)定義

deque容器是C++標準模版庫(STL,Standard Template Library)中的部份內容。deque容器類與vector相似,支持隨機訪問和快速插入刪除,它在容器中某一位置上的操做所花費的是線性時間。與vector不一樣的是,deque還支持從開始端插入數據:push_front()。網絡

(2)底層實現

deque 即雙端隊列。是一種具備隊列和棧的性質的數據結構。雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端進行。數據結構

雙端隊列是限定插入和刪除操做在表的兩端進行的線性表。這兩端分別稱作端點1和端點2。也可像棧同樣,能夠用一個鐵道轉軌網絡來比喻雙端隊列。在實際使用中,還能夠有輸出受限的雙端隊列(即一個端點容許插入和刪除,另外一個端點只容許插入的雙端隊列)和輸入受限的雙端隊列(即一個端點容許插入和刪除,另外一個端點只容許刪除的雙端隊列)。而若是限定雙端隊列從某個端點插入的元素只能從該端點刪除,則該雙端隊列就蛻變爲兩個棧底相鄰的棧了。函數

(3)使用

使用deque容器以前必須加上<deque>頭文件:#include<deuqe>。spa

deque屬於std命名域的內容,所以須要經過命名限定:using std::deque;也能夠直接使用全局的命名空間方式:using namespace std。
code

(4)特色

優勢:(1)隨機訪問,即[]操做和deque.at();orm

          (2)插入與刪除方便;索引

          (3)可在雙端進行pop,push。隊列

缺點:佔用內存多。內存

二、成員函數

(1)構造函數

/*構造函數*/
deque<Elem> c 
//建立一個空的deque
deque<Elem> c1(c2) 
//複製一個deque。
deque<Elem> c(n) 
//建立一個deque,含有n個數據,數據均已缺省構造產生。
deque<Elem> c(n, elem) 
//建立一個含有n個elem拷貝的deque。
deque<Elem> c(beg,end) 
//建立一個以[beg;end)區間的deque。
~deque<Elem>() 
//銷燬全部數據,釋放內存。

(2)賦值操做

c.assign(n,num);
//將n個num拷貝複製到容器c
c.assign(beg,end)將[beg,end);
//區間的數據拷貝複製到容器c

示例:it

deque<int> d1 {1,2,3,4,5},d2;
    d2.assign(2, 8);
    deque<int>::iterator it;
    cout << "d2.assign(n,num):";
    for(it=d2.begin();it!=d2.end();it++){
        cout << *it << " ";
    }
    d2.assign(d1.begin(), d1.begin()+3);
    cout << "d2.assign(beg,end):";
    for(it=d2.begin();it!=d2.end();it++){
        cout << *it << " ";
    }
    cout << endl;

(3)插入操做

c.push_back(num)在末尾位置插入元素
c.pop_back()刪除末尾位置的元素
c.push_front(num)在開頭位置插入元素
c.pop_front()刪除開頭位置的元素

c.insert(pos,num)在pos位置插入元素num
c.insert(pos,n,num)在pos位置插入n個元素num
c.insert(pos,beg,end)在pos位置插入區間爲[beg,end)的元素

示例:

deque<int> d {1,2,3,4,5};
    deque<int>::iterator it;
    cout << "insert before:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    d.insert(d.end(),22);
    d.insert(d.end(), 3,88);
    int a[5] = {1,2,3,4,5};
    d.insert(d.begin(),a,a+3);
    cout << "insert after:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
deque<int> d {1,2,3,4,5};
    d.push_back(10);
    deque<int>::iterator it;
    cout << "push_back(num):" ;
    for(it=d.begin();it!=d.end();it++){
            cout << *it << " ";
    }
    cout << endl;
    
    d.pop_back();
    cout << "pop_back(num):" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    
    d.push_front(10);
    cout << "push_front(num):" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    
    d.pop_front();
    cout << "pop_front(num):" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    return 0;

(4)刪除操做

c.clear()清除c容器中擁有的全部元素

c.erase(pos)刪除pos位置的元素c.erase(beg,end)刪除區間爲[beg,end)的元素
c.erase(beg,end)刪除區間爲[beg,end)之間的元素

示例:

deque<int> d {1,2,3,4,5};
    deque<int>::iterator it;
    cout << "clear before:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    d.clear();
    cout << "clear after:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
deque<int> d {1,2,3,4,5};
    d.erase(d.begin());
    deque<int>::iterator it;
    cout << "erase(pos) after:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    d.erase(d.begin(), d.begin()+3);
    cout << "erase(beg,end) after:" ;
    for(it=d.begin();it!=d.end();it++){
        cout << *it << " ";
    }
    cout << endl;

(5)定位操做

c.begin()返回指向第一個元素的迭代器
c.end()返回指向最後一個元素下一個位置的迭代器

c.rbegin()返回指向反向隊列的第一個元素的迭代器(即原隊列的最後一個元素)
c.rend()返回指向反向隊列的最後一個元素的下一個位置(即原隊列的第一個元素的前一個位置)

c.at(pos)返回索引爲pos的位置的元素,會執行邊界檢查,若是越界拋出out_of_range異常

c.front()返回c容器的第一個元素
c.back()返回c容器的最後一個元素

示例:

deque<int> d {1,2,3,4,5};
 deque<int>::iterator it;
 for(it=d.begin();it!=d.end();it++){
 cout << *it << " ";
 }
cout << endl;
deque<int> d {1,2,3,4,5};
deque<int>::reverse_iterator it;
for(it=d.rbegin();it!=d.rend();it++){
cout << *it << " ";
}
cout << endl;
deque<int> d {1,2,3,4,5};
cout << "d.at(pos):" << d.at(2);
return 0;
deque<int> d {1,2,3,4,5};
if(!d.empty()){
    cout << "d.front():" << d.front() << endl;
    cout << "d.back(): " << d.back() << endl;
  }

(6)數據大小

c.empty()判斷c容器是否爲空
c.size()返回c容器中實際擁有的元素個數
c.max_size()返回c容器可能存放元素的最大數量
c.resize(num)重新定義容器的大小

示例:

deque<int> d {1,2,3,4,5};
    if(!d.empty()){
        cout << "d is not empty!" << endl;
    }else{
        cout << "d is empty!" << endl;
    }
    return 0;
deque<int> d {1,2,3,4,5};
cout << "d.size():" << d.size() << endl;
return 0;
deque<int> d {1,2,3,4,5};
cout << "d.max_size():" << d.max_size() << endl;
return 0;
deque<int> d {1,2,3,4,5};
    cout << "d.size():" << d.size() << endl;
    d.resize(d.size()+5);
    cout << "d.resize() after:" << d.size() <<endl;
    deque<int>::iterator it;
    cout << "resize() after:" ;
    for(it=d.begin();it!=d.end();it++){
    cout << *it << " ";
    }
    cout << endl;

(7)交換操做

c1.swap(c2)交換容器c1,c2;
swap(c1,c2)同上。

示例:

deque<int> d1 {1,2,3,4,5},d2,d3;
    d1.swap(d2);
    deque<int>::iterator it;
    cout << "d1 swap after:" ;
    for(it=d1.begin();it!=d1.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    cout << "d2 swap after:" ;
    for(it=d2.begin();it!=d2.end();it++){
        cout << *it << " ";
    }
    cout << endl;
    
    swap(d3,d2);
    cout << "d3 swap after:" ;
    for(it=d3.begin();it!=d3.end();it++){
        cout << *it << " ";
    }
    cout << endl;

(8)重載運算符

operator==
operator!=
operator<
operator<=
operator>
operator>=

示例:

deque<int> d1 {1,2,3,4,5},d2;
    d2 = d1;
    deque<int>::iterator it;
    for(it=d2.begin();it!=d2.end();it++){
        cout << *it << " ";
    }
    cout << endl;
相關文章
相關標籤/搜索