STL deque 雙向隊列介紹

deque函數:

deque容器爲一個給定類型的元素進行線性處理,像向量一樣,它能夠快速地隨機訪問任一個元素,並且能夠高效地插入和刪除容器的尾部元素。但它又與vector不同,deque支持高效插入和刪除容器的頭部元素,因此也叫做雙端隊列

deque的特點:

  • 支持隨機訪問,即支持[]以及at(),但是性能沒有vector好
  • 可以在內部進行插入和刪除操作,但性能不及list。

deque和vector的不同之處:

  • deque兩端都能夠快速的插入和刪除元素vector只能在尾端進行。
  • deque的元素存取和迭代器操作會稍微慢一些。因爲deque的內部結構會多一個簡介過程。
  • 迭代器是特殊的智能指針,而不是一般指針。它需要在不同的區塊之間跳轉。
  • deque可以包含更多的元素,其max_size可能更大。因爲不止使用一塊內存。
  • 不支持對容量和內存分配時機的控制。

容器的選擇:

  • 強調快速隨機訪問,則vector比list好得多。
  • 已知要存儲元素的個數。vector好於list。
  • 強調增刪且不要在兩端插入修改元素,則list顯然要比vector好。
  • 除非我們需要在容器首部插入和刪除元素,deque好於vector。

插入操作:

deque<string> dec;

(1)void push_front(const T& x): 雙端隊列頭部增加一個元素X

dec.push_front("world");  //頭部插入

(2)void push_back(const T& x):雙端隊列尾部增加一個元素x

dec.push_back("hello");   //尾部插入

(3)iterator insert(iterator it,const T& x):雙端隊列中某一元素前增加一個元素x

dec.insert(dec.end(), "aaaaaa");

(4)void insert(iterator it,int n,const T& x):雙端隊列中某一元素前增加n個相同的元素x

dec.insert(dec.end(), 5, "bbb");

(5)void insert(iterator it,const_iterator first,const_iteratorlast):雙端隊列中某一元素前插入另一個相同類型向量的[forst,last)間的數據

deque<string> t_dec(2,"ccc");
dec.insert(dec.end(), t_dec.begin(), t_dec.end());

刪除操作:

(1)iterator erase(iterator it):刪除雙端隊列中的某一個元素

dec.erase(dec.begin());

(2)iterator erase(iterator first,iterator last):刪除雙端隊列中[first,last)中的元素

dec.erase(dec.end()-3, dec.end());

(3)void pop_front():刪除雙端隊列中最前一個元素

dec.pop_front();  //頭部刪除

(4)void pop_back():刪除雙端隊列中最後一個元素

dec.pop_back();  //尾部刪除

(5)void clear():清空雙端隊列

dec.clear();  //清空

刪除指定元素:

//刪除指定元素
deque<string>::iterator iter;
for(iter = dec.begin(); iter != dec.end(); iter++){
    if(*iter == "aaa") {
        iter = dec.erase(iter);
    }
}

遍歷函數:

(1)reference at(int pos):返回pos位置元素的引用

deque<string> dec;
dec.push_back("aaaa");
dec.push_back("bbbb");
string s=dec.at(0);
cout<<s<<endl; //"aaaa"

(2)reference front():返回首元素的引用

string s=dec.front();  //返回第一個元素

(3)reference back():返回尾元素的引用

string s=dec.back();  //返回最後一個元素

(4)iterator begin():返回向量頭指針,指向第一個元素

(5)iterator end():返回指向向量中最後一個元素下一個元素的指針(不包含在向量中)

(6)reverse_iterator rbegin():反向迭代器,指向最後一個元素

(7)reverse_iterator rend():反向迭代器,指向第一個元素的前一個元素

//反序輸出
deque<string>::reverse_iterator rit;
for(rit = dec.rbegin(); rit != dec.rend(); ++rit)
{
    cout<<*rit<<endl;
}

判斷函數

(1)bool empty() const:向量是否爲空,若true,則向量中無元素

大小函數

(1)int size() const:返回向量中元素的個數

(2)int max_size() const:返回最大可允許的雙端對了元素數量值

(3)resize()函數:調整容器大小

//調整容器大小,不足以參數2補充
dec.resize(5);
dec.resize(5,"hello");

其他函數

(1)void swap(deque&):交換兩個同類型向量的數據

deque<string> s_dec;
swap(s_dec, dec);  //交換容器內容
s_dec.swap(dec);   //交換容器內容

(2)void assign(int n,const T& x):向量中第n個元素的值設置爲x

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章