【C++】队列优先队列详解——deque.queue.priority_queue
deque
可以隊首和隊尾插入,也可以隊首和隊尾彈出
支持隨機訪問,即可以直接用下標來訪問元素。它和vector有點像,因為它可以index索引和at()函數索引,當然,也可以迭代器索引。
此外,它可以進行指定尺寸的構造,queue就不可以指定尺寸構造。
構造函數
deque<int> q1; deque<int> q2(6,8);//6個值為8的成員 deque<int> q3(q2.begin() + 2, q2.end()); deque<int> q4(q2);迭代器
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-AuIBjgSo-1669195255380)(C:/Users/l/AppData/Roaming/Typora/typora-user-images/image-20221123160955743.png)]
常用操作
操作明顯多于queue和pq
empty(); //判斷容器是否為空 clear(); //清空容器的所有數據 size(); //返回容器中的元素的個數 resize(num); //重新指定容器的長度為num,若容器變長,則以默認值填充新位置。//如果容器變短,則末尾超出容器長度的元素被刪除。 resize(num,elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則超出容器長度的元素被刪除。 clear(); //清空容器的所有數據 swap();訪問操作
at(int idx); //返回索引idx所指的數據 operator[]; //返回索引idx所指的數據 front(); //返回容器中第一個數據元素 back(); //返回容器中最后一個數據元素插入刪除覆蓋
deque<int>::iterator it = bar.begin(); push_back(elem); //在容器尾部添加一個數據 push_front(elem); //在容器頭部插入一個數據 pop_back(); //刪除容器最后一個數據 pop_front(); //刪除容器第一個數據insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新數據的位置。 insert(pos,n,elem); //在pos位置插入n個elem數據,無返回值 insert(pos,beg,end); //在pos位置插入[beg,end)區間的數據,無返回值erase(beg,end); //刪除[beg,end)區間的數據,返回下一個數據的位置。 erase(pos); //刪除pos位置的數據,返回下一個數據的位置。assign(beg, end); //將[beg,end)區間中的數據拷貝賦值給本身。 assign(n,elem); //將n個elem拷貝賦值給本身。關于push和emplace的區別
https://blog.csdn.net/jokerMingge/article/details/119736247
C++11
emplace() emplace_back() emplace_front() emplace_cbegin emplace_crbegin emplace_cend emplace_crend ; shrink_to_fit(); //請求容器減少內存使用以適應其大小。與其他container的區別
頭插
vector對于頭部的插入效率低,數據量越大,效率越低,例如頭部后有十萬個數據,則往頭部插入一個數據時,十萬個數據都需要往后挪一挪才能在頭部插入數據。deque相對而言,對頭部的插入刪除速度會比vector快。deque在頭部和尾部進行數據插入和刪除操作更加高效。
如果沒有頻繁在頭部或尾部進行插入和刪除操作,deque比list和forward_list的性能更差。
訪問
vector訪問元素時的速度會比deque快。
存儲
與vector不同的是,deque不能保證所有的元素存儲在連續的空間中,在deque中通過指針加量方式訪問元素可能會導致非法的操作。
vector使用使用動態數組,該數組通常需要動態增長;deque中的元素可能分散在不同的存儲塊中,在deque中保存一些必要的信息,通常用來在常數范圍內直接訪問deque中的任何一個元素,所以deque的內部實現比vector復雜,但是這些額外信息使得dque在某些情況下增長更加的高效,特別是在序列比較大,重新分配成本比較高的情況下。
內部工作原理
和 vector 容器采用連續的線性空間不同,deque 容器存儲數據的空間是由一段一段等長的連續空間構成,各段空間之間并不一定是連續的,可以位于在內存的不同區域。為了管理這些連續空間,deque 容器用數組存儲著各個連續空間的首地址。也就是說,數組中存儲的都是指針,指向那些真正用來存儲數據的各個連續空間。
通過建立數組,deque 容器申請的這些分段的連續空間就能實現“整體連續”的效果。換句話說,當 deque 容器需要在頭部或尾部增加存儲空間時,它會申請一段新的連續空間,同時在數組的開頭或結尾添加指向該空間的指針,由此該空間就串接到了 deque的頭部或尾部。
priority_queue
優先隊列是一種會按照默認或自定義的優先級進行自動排序的隊列,其特點是優先級高的元素排在隊首,低的排在隊尾。
創建
數據類型:可以是int、double等基本類型,也可以是自定義的結構體。
容器類型:一般為deque(雙端列表)、vector(向量容器),可省略,省略時以vector為默認容器。
pq:優先隊列名。
常用操作
pq.push(); //入隊 pq.pop(); //出隊 pq.size() //返回當前對中元素個數 pq.top(); //優先隊列 取隊首元素 pq.empty(); //判斷是否為空(空返回 1,非空返回 0) C++11 pq.swap() pq.emplace()與queue的區別在于queue有front()和back(),而pq只有top()
queue
(58條消息) C++隊列queue用法詳解_KEPROM的博客-CSDN博客_c++ queue
一般直接用deque。deque的功能比queue更全,而且queue底層也是用deque創建的
創建
queue<數據類型,容器類型> q;
數據類型:可以是int、double等基本類型,也可以是自定義的結構體。
容器類型:一般為deque或者list(雙向鏈表),可省略,省略時以deque為默認容器。
常用操作
q.push(x); //入隊,將元素 x 從隊尾插入(尾插法) q.pop(); //出隊,刪除對首元素,并返回其值 q.size(); //返回隊中元素個數 q.front(); //返回隊首元素 q.back(); //返回隊尾元素 q.empty(); //判斷是否為空(空返回 1,非空返回 0) C++11 q.swap(q2) q.emplace(x) //入隊empty()函數可以判斷隊列是否為空,但沒有clear來清空,可以創建空的queue用swap函數交換
queue q2; if (q1.empty()) { cout << “q1 is empty” << endl; } q1.swap(q2); if (q1.empty()) { cout << “q1 is empty after swap” << endl; }總結
以上是生活随笔為你收集整理的【C++】队列优先队列详解——deque.queue.priority_queue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看雪论坛 『Android安全』版优秀和
- 下一篇: 区块链技术正向积极乐观的智能前景发展