c++ 双端队列 deque 之 (头部、尾部)插入元素/删除元素/
頭文件? ? ?#include <deque>
和vector用法基本相同
沒有 capacity() reserve()
有了push_back(),pop_back()
//insert elements in first a.push_front(some_element) //insert elements at last a.push_back(some_element); //pop element at first a.pop_front(some_element); //pop element at last a.pop_back(some_element); #include <iostream> #include <string> #include <deque> #include <algorithm> #include <vector> #include <iterator> using namespace std; int main() {vector<int> v_int = {1,2,3,4};deque<int> d_int;d_int.push_back(1);d_int.push_back(2);d_int.push_back(1001);d_int.push_back(1002);d_int.push_front(-1);d_int.push_front(-2);d_int.push_front(-3);d_int.push_front(-4);for(size_t i = 0;i != d_int.size() ; ++i){cout << "a[" << i << "] = " << d_int[i] << endl;//cout << v_int[i] << endl;}cout << "iterator 's output:" << endl;d_int.pop_front();d_int.pop_back();//cout << del_1 << endl;//cout << del_2 << endl;for(deque<int>::iterator i = d_int.begin(); i != d_int.end() ;++ i )cout << *i <<endl;return 0; }6、雙端隊(duì)列deque
所謂的deque是”double ended queue”的縮寫,雙端隊(duì)列不論在尾部或頭部插入元素,都十分迅速。而在中間插入元素則會(huì)比較費(fèi)時(shí),因?yàn)楸仨氁苿?dòng)中間其他的元素。雙端隊(duì)列是一種隨機(jī)訪問的數(shù)據(jù)類型,提供了在序列兩端快速插入和刪除操作的功能,它可以在需要的時(shí)候改變自身大小,完成了標(biāo)準(zhǔn)的C++數(shù)據(jù)結(jié)構(gòu)中隊(duì)列的所有功能。
Vector是單向開口的連續(xù)線性空間,deque則是一種雙向開口的連續(xù)線性空間。deque對(duì)象在隊(duì)列的兩端放置元素和刪除元素是高效的,而向量vector只是在插入序列的末尾時(shí)操作才是高效的。deque和vector的最大差異,一在于deque允許于常數(shù)時(shí)間內(nèi)對(duì)頭端進(jìn)行元素的插入或移除操作,二在于deque沒有所謂的capacity觀念,因?yàn)樗莿?dòng)態(tài)地以分段連續(xù)空間組合而成,隨時(shí)可以增加一段新的空間并鏈接起來。換句話說,像vector那樣“因舊空間不足而重新配置一塊更大空間,然后復(fù)制元素,再釋放舊空間”這樣的事情在deque中是不會(huì)發(fā)生的。也因此,deque沒有必要提供所謂的空間預(yù)留(reserved)功能。
雖然deque也提供Random Access Iterator,但它的迭代器并不是普通指針,其復(fù)雜度和vector不可同日而語,這當(dāng)然涉及到各個(gè)運(yùn)算層面。因此,除非必要,我們應(yīng)盡可能選擇使用vector而非deque。對(duì)deque進(jìn)行的排序操作,為了最高效率,可將deque先完整復(fù)制到一個(gè)vector身上,將vector排序后(利用STL的sort算法),再復(fù)制回deque。
deque是一種優(yōu)化了的對(duì)序列兩端元素進(jìn)行添加和刪除操作的基本序列容器。通常由一些獨(dú)立的區(qū)塊組成,第一區(qū)塊朝某方向擴(kuò)展,最后一個(gè)區(qū)塊朝另一方向擴(kuò)展。它允許較為快速地隨機(jī)訪問但它不像vector一樣把所有對(duì)象保存在一個(gè)連續(xù)的內(nèi)存塊,而是多個(gè)連續(xù)的內(nèi)存塊。并且在一個(gè)映射結(jié)構(gòu)中保存對(duì)這些塊以及順序的跟蹤。
1、聲明deque容器
#include<deque> ?// 頭文件
deque<type> deq; ?// 聲明一個(gè)元素類型為type的雙端隊(duì)列que
deque<type> deq(size); ?// 聲明一個(gè)類型為type、含有size個(gè)默認(rèn)值初始化元素的的雙端隊(duì)列que
deque<type> deq(size, value); ?// 聲明一個(gè)元素類型為type、含有size個(gè)value元素的雙端隊(duì)列que
deque<type> deq(mydeque); ?// deq是mydeque的一個(gè)副本(是真的不?那上面怎么解釋)
deque<type> deq(first, last); ?// 使用迭代器first、last范圍內(nèi)的元素初始化deq
2、deque的常用成員函數(shù)
deque<int> deq;
deq[ ]:用來訪問雙向隊(duì)列中單個(gè)的元素。
deq.front():返回第一個(gè)元素的引用。
deq.back():返回最后一個(gè)元素的引用。
deq.push_front(x):把元素x插入到雙向隊(duì)列的頭部。
deq.pop_front():彈出雙向隊(duì)列的第一個(gè)元素。
deq.push_back(x):把元素x插入到雙向隊(duì)列的尾部。
deq.pop_back():彈出雙向隊(duì)列的最后一個(gè)元素。
3、deque的一些特點(diǎn)
支持隨機(jī)訪問,即支持[ ]以及at(),但是性能沒有vector好。
可以在內(nèi)部進(jìn)行插入和刪除操作,但性能不及l(fā)ist。
deque兩端都能夠快速插入和刪除元素,而vector只能在尾端進(jìn)行。
deque的元素存取和迭代器操作會(huì)稍微慢一些,因?yàn)閐eque的內(nèi)部結(jié)構(gòu)會(huì)多一個(gè)間接過程。
deque迭代器是特殊的智能指針,而不是一般指針,它需要在不同的區(qū)塊之間跳轉(zhuǎn)。
deque可以包含更多的元素,其max_size可能更大,因?yàn)椴恢故褂靡粔K內(nèi)存。
deque不支持對(duì)容量和內(nèi)存分配時(shí)機(jī)的控制。
在除了首尾兩端的其他地方插入和刪除元素,都將會(huì)導(dǎo)致指向deque元素的任何pointers、references、iterators失效。不過,deque的內(nèi)存重分配優(yōu)于vector,因?yàn)槠鋬?nèi)部結(jié)構(gòu)顯示不需要復(fù)制所有元素。
deque的內(nèi)存區(qū)塊不再被使用時(shí),會(huì)被釋放,deque的內(nèi)存大小是可縮減的。不過,是不是這么做以及怎么做由實(shí)際操作版本定義。
deque不提供容量操作:capacity()和reverse(),但是vector可以。
?
?
總結(jié)
以上是生活随笔為你收集整理的c++ 双端队列 deque 之 (头部、尾部)插入元素/删除元素/的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++顺序容器之deque初探
- 下一篇: s3c2440移植MQTT