C++中的deque容器

deque容器基本概念

功能:雙端數組,可以對頭端進行插入和刪除操作

deque與vector區別:

  • vector對于頭部的插入刪除掉率低,數據量越大,效率越低
  • deque相對而言,對頭部的插入刪除速度會比vector快
  • vetcor訪問元素時的速度會比deque快,這和兩者內部的實現有關

deque工作原理:?

deque容器內部有一個中控器,維護每段緩沖區中的內容,緩沖區中存放真實數據

中控器維護的是每個緩沖區的地址,使得使用deque時像一片連續的區域

  • deque容器中的迭代器也是支持隨機訪問的。

deque構造函數?

功能描述

  • deque容器構造

函數原型:

deque<T> deqT;  //默認構造形式deque(beg,end);//構造函數將【beg,end)區間中的元素拷貝給本身deque(n,ele); //構造函數將n個elem拷貝給本身deque(const deque &deq);  //拷貝構造函數
#include <iostream>
using namespace std;
#include <deque>//一般的話會在deque前面加上一個const表明我這個容器只能夠讀,不能夠進行修改
void printDeque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque構造函數
void test01()
{deque<int> d1;//默認構造函數for(int i=0;i<10;i++){d1.push_back(i); //向隊列尾部添加元素d1.push_front(i+10);//向隊列頭部插入元素}printDeque(d1);deque<int> d2(d1.begin(),d1.end());//區間構造函數printDeque(d2);deque<int> d3(10,100);printDeque(d3);deque<int> d4(d2);//拷貝構造函數printDeque(d4);
}int main()
{test01(); //測試deque的構造函數return 0;}

deque容器賦值操作?

功能描述:

  • 給deque容器賦值

函數原型

deque& operator=(const deque &deq);//重載等號操作符assign(beg,end);   //將[beg,end)區間中的數據拷貝賦值給本身assign(n,elem);    //將n個elem拷貝賦值給本身
#include <iostream>
#include <deque>
using namespace std;void printDeque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器的賦值操作
void test01()
{deque<int> d1;for(int i=0;i<10;i++){d1.push_back(i);}printDeque(d1);//operator=賦值deque<int> d2;d2=d1;printDeque(d2);//assign賦值deque<int> d3;d3.assign(d1.begin(),d1.end());printDeque(d3);deque<int> d4;d4.assign(10,100);printDeque(d4);}int main()
{test01();return 0;}

因此deque賦值操作跟vector相同,需熟練掌握。

deque容器大小操作

功能描述:對deque容器的大小進行操作

函數原型

deque.empty(); //判斷容器是否為空deque.size();  //返回容器中元素的個數deque.resize(num); //重新指定容器的長度為num,若容器變長,則以默認值填充新位置;若容器變短,則         末尾超出容器長度的元素被刪除deque.resize(num,elem);  //重新指定容器的長度為num,若容器變長,則利用elem值填充新位置;若容器變短,則末尾超出容器長度的元素被刪除

在deque容器中是沒有容量的限制的,它可以在后面無限制的擴充新的容量區域。

#include <iostream>
using namespace std;
#include <deque>//對里面的元素進行打印輸出
void printDeque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器的一個大小操作
void test01()
{deque<int> d1;for(int i=0;i<10;i++){d1.push_back(i);}printDeque(d1);if(d1.empty()){cout<<"d1 is empty"<<endl;}else{cout<<"di is not empty"<<endl;cout<<"d1 size: "<<d1.size()<<endl;  //deque容器沒有容量概念,因此其數據可以無限的往里面去放,這跟其內部的結構有關系}//重新制定其大小//d1.resize(15);//printDeque(d1);//假如不想用0來填充d1.resize(15,1);printDeque(d1);d1.resize(5);printDeque(d1);}int main()
{test01();}

?deque插入和刪除

功能描述:向deque容器中插入和刪除數據

函數原型:

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)區間的數據,無返回值clear();            //清空容器內的所有數據erase(beg,end);  //刪除[beg,end)區間的數據,返回下一個數據的位置erase(pos);//刪除pos位置的數據,返回下一個數據的位置
#include <iostream>
using namespace std;    
#include <deque>void print_Deque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout << *it << " ";}cout<<endl;}
//deque容器的插入和刪除
void test01()
{//對于兩端進行操作deque<int> d1;d1.push_back(10);//往尾部插入元素d1.push_back(20);//頭插d1.push_front(100);//往頭部插入元素d1.push_front(200);print_Deque(d1);//尾刪d1.pop_back();d1.pop_front();print_Deque(d1);}//對于指定的位置進行一個插入和刪除
void test02()
{deque<int> d2;d2.push_back(10);d2.push_back(20);d2.push_front(100);d2.push_front(200);print_Deque(d2);//利用insert方式來進行插入d2.insert(d2.begin(),1000);print_Deque(d2);d2.insert(d2.begin(),2,10000);print_Deque(d2);//按照區間來進行插入deque<int> d3;d3.push_back(1);d3.push_back(2);d3.push_back(3);d2.insert(d2.begin(),d3.begin(),d3.end());print_Deque(d2);
}//刪除
void test03()
{deque<int> d4;d4.push_back(10);d4.push_back(20);d4.push_front(100);d4.push_front(200);print_Deque(d4);// d4.erase(d4.begin());// print_Deque(d4);//或者是說刪除其他位置的元素deque<int>::iterator it=d4.begin();it++;d4.erase(it);print_Deque(d4);//按照區間的方式刪除d4.erase(d4.begin(),d4.end());print_Deque(d4);//還有一個成員函數是專門用來清空的d4.clear();print_Deque(d4);}int main()
{test03();}

插入刪除提供的位置是迭代器。

deque數據存取操作

功能描述:對deque中的數據存取操作

函數原型

at(int idx); //返回索引值idx所指的數據operator[];//返回索引idx所指的數據front();//返回容器中第一個數據元素back();//返回容器中最后一個數據元素
#include <iostream>
using namespace std;
//deque容器的數據存取操作
#include <deque>void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);//此時我們不用迭代器了,而是利用[]方式訪問元素//300,200,100,10,20,30for(int i=0;i<d.size();i++){cout<<d[i]<<" ";}cout<<endl;//通過at的方式來訪問元素for(int i=0;i<d.size();i++){cout<<d.at(i)<<" ";}cout<<endl;//訪問頭尾元素cout<<"頭元素:"<<d.front()<<endl;cout<<"尾元素:"<<d.back()<<endl;}int main()
{test01();}

deque排序

功能描述:利用算法實現對deque容器進行排序

算法:

sort(iterator beg,iterator end)//對beg和end區間內元素進行排序
#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;void print_Deque(const deque<int> &d)
{for(deque<int>::const_iterator it=d.begin();it!=d.end();it++){cout<<*it<<" ";}cout<<endl;
}//deque容器排序
void test01()
{deque<int> d;d.push_back(10);d.push_back(20);d.push_back(30);d.push_front(100);d.push_front(200);d.push_front(300);print_Deque(d);//排序操作//對于支持隨機訪問的迭代器的容器,都可以利用sort算法來進行排序//vector容器也可以利用sort算法來進行排序sort(d.begin(),d.end());cout<<"排序后的結果:"<<endl;print_Deque(d);
}int main()
{test01();}

案例-評委打分

有五名選手:選手ABCDE,10個評委分別對每一名選手進行打分,去除最高分,去除評為中最低分,取平均分。

實現步驟:

  • 創建五名選手,放到vector中
  • 遍歷vector容器,取出每一個選手,執行for循環,可以吧10個評分打分存到deque容器中(因為deque容器對于頭端和尾端的操作比較方便)
  • sort算法對deque容器中分數排序,取出最高和最低分
  • deque容器遍歷一遍,累計總分
  • 獲取平均分
#include <iostream>
using namespace std;
#include <vector>
#include <deque>
#include <algorithm>
#include <string>//選手類
class Person{public:Person(string name,int score){this->m_Name=name;this->m_Score=score;}string m_Name;//姓名int m_Score;//分數};void creatPerson(vector<Person> &v)
{string nameSeed="ABCDE";for(int i=0;i<5;i++){string name="選手";name+=nameSeed[i];int score=0;Person p(name,score);//將創建的Person對象放入到容器中v.push_back(p);}
}void setScore(vector<Person> &v)
{for(vector<Person>::iterator it=v.begin();it!=v.end();it++){//將評委的分數放入到deque容器中deque<int> d;for(int i=0;i<10;i++){int score=rand()%41+60;  //60~100d.push_back(score);}//輸出每一個評委給他打的分數// cout<<it->m_Name<<"打分: "<<endl;// for(deque<int>::iterator dit=d.begin();dit!=d.end();dit++)// {//     cout<<*(dit)<<" ";// }// cout<<endl;//排序sort(d.begin(),d.end());//去除一個最高和最低分d.pop_back();d.pop_front();//取平均分int sum=0;for(deque<int>::iterator dit=d.begin();dit!=d.end();dit++){sum+=*(dit);}int average_Score=sum/d.size();//將平均分賦值給選手it->m_Score=average_Score;}
}
void showScore(vector<Person> &v)
{for(vector<Person>::iterator pit=v.begin();pit!=v.end();pit++){cout<<"姓名: "<<pit->m_Name<<" 平均分:"<<pit->m_Score<<endl;}
}int main()
{//1.創建5名選手vector<Person> v;//存放選手的容器creatPerson(v);//測試// for(vector<Person>::iterator it=v.begin();it!=v.end();it++)// {//     cout<<"姓名:"<<(*it).m_Name<<" 分數:"<<(*it).m_Score<<" ";// }//2.給5名選手打分setScore(v);//3.顯示最后的得分showScore(v);}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90089.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90089.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90089.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

閑庭信步使用圖像驗證平臺加速FPGA的開發:第三十課——車牌識別的FPGA實現(2)實現車牌定位

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

前端性能優化:從“龜速“到“閃電“的終極加速指南

一、性能指標:你的網站"體檢報告" ?? 1. 核心Web指標(Google排名因素) 指標 全稱 優秀標準 優化方向 LCP 最大內容繪制 ≤2.5s 關鍵資源預加載 FID 首次輸入延遲 ≤100ms 減少長任務 CLS 累計布局偏移 ≤0.1 預留圖片尺寸 測量方法: // 使用web-vitals庫測量…

Linux 重定向和緩沖區

序言&#xff1a; 前面在Linux 基礎文件IO操作-CSDN博客這篇博客里說了很多函數無論是在語言層還是在系統調用的方面。在調用系統調用open的時候會返回一個整型&#xff0c;在write傳參的時候第一個參數是一個叫fd的東西&#xff0c;這個是什么東西&#xff1f;這篇博客會詳細…

web登錄頁面

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>簡易登錄頁面</title><style>* {mar…

Java中關于線程池的解析

引語在學習了線程與多線程的相關知識后&#xff0c;我們已經能夠實現在程序中使多個任務并行&#xff0c;但是我們在操作時候&#xff0c;往往每執行一個的任務就需要創建一個新的線程。這種方式在需要執行任務很多時不利于我們對線程的管理&#xff0c;且創建過多線程也非常占…

J2EE模式---前端控制器模式

前端控制器模式基礎概念前端控制器模式&#xff08;Front Controller Pattern&#xff09;是一種結構型設計模式&#xff0c;其核心思想是將應用程序的所有請求集中到一個中央處理器&#xff08;前端控制器&#xff09;進行處理&#xff0c;由它負責接收請求、協調處理流程并返…

模塊加載、ES、TS、Babel 淺析

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

day056-Dockerfile案例與Docker Compose

文章目錄0. 老男孩思想-老男孩名言警句1. Dockerfile指令&#xff1a;ENV與ARG的區別&#xff1f;2. 創建WordPress鏡像2.1 CA證書2.1.1 客戶端訪問HTTPS站點&#xff08;阿里云鏡像源&#xff09;過程2.1.2 查看Windows的CA證書2.1.3 ubuntu查看CA證書是否安裝2.2 準備apt下載…

gcc 源碼分析:從IR-RTL 到匯編輸出

在完成了IR-RTL的優化與寄存器分配后就來到匯編代碼的輸出&#xff1a;實現如下&#xff1a;class pass_final : public rtl_opt_pass { public:pass_final (gcc::context *ctxt): rtl_opt_pass (pass_data_final, ctxt){}/* opt_pass methods: */unsigned int execute (functi…

STC89C52系列單片機內部結構詳解

STC89C52 是基于 MCS-51 內核的增強型單片機&#xff0c;其內部結構集成了多種功能模塊&#xff0c;具備強大的數據處理和控制能力&#xff0c;是嵌入式系統中常用的一種微控制器。本文將結合內部結構框圖&#xff0c;詳細介紹 STC89C52 的各個核心組成部分及其功能作用。一、中…

Linux防火墻管理和基礎服務(FTP/SFTP)

防火墻管理# 開放端口firewalld-cmd --add-port880/tcp --permanent# 移除端口或阻止端口firewalld-cmd --remove-port880/tcp --permanent# 重啟服務systemctl restart firewalld# 查看防火墻開放哪些端口&#xff08;查看當前區域的規則&#xff09;firewall-cmd --lis…

Selenium+Java 自動化測試入門到實踐:從環境搭建到元素操作

在自動化測試領域&#xff0c;Selenium 憑借其強大的跨瀏覽器兼容性和靈活的 API&#xff0c;成為 Web 應用測試的首選工具。而 Java 作為一門穩定且廣泛應用的編程語言&#xff0c;與 Selenium 結合能構建出高效、可維護的自動化測試框架。本文將從環境搭建開始&#xff0c;逐…

Hugging Face 模型的緩存和直接下載有什么區別?

Hugging Face 模型的緩存和直接下載&#xff08;下載到本地文件夾&#xff09;是兩種不同的模型管理方式&#xff0c;它們在使用場景、存儲結構和效率上各有優劣。 以下是它們之間的主要區別&#xff1a; Hugging Face 緩存 (Cache) 當您通過 transformers 庫中的 from_pretrai…

JavaScript AJAX 實現,演示如何將 Token 添加到 Authorization

以下是一個完整的原生 JavaScript AJAX 實現&#xff0c;演示如何將 Token 添加到 Authorization 頭部的示例&#xff1a;基礎實現html復制代碼<!DOCTYPE html> <html> <head><title>AJAX Token 示例</title><script>// 獲取當前用戶的 To…

開發語言的優劣勢對比及主要應用領域分析

開發語言是程序員用來編寫軟件指令的工具。每種語言都有自己的設計哲學、語法&#xff08;規則&#xff09;和應用場景&#xff0c;但沒有“放之四海而皆準”的最佳語言。以下是主流和重要開發語言的介紹&#xff0c;按主要應用領域分類&#xff1a; 一、全能型語言 (可在多個領…

Java學習-------事務失效

在 Java 開發中&#xff0c;事務是保證數據一致性和完整性的關鍵機制&#xff0c;尤其在涉及多步數據庫操作的業務場景中不可或缺。然而&#xff0c;在實際開發過程中&#xff0c;事務常常會出現 “失效” 的情況 —— 預期的回滾沒有發生&#xff0c;數據出現不一致。 Java 事…

JavaScript 01 JavaScript 是什么

1.1 JavaScript 是什么JavaScript 是一門世界上最流行的腳本語言&#xff08;基本所有平臺的所有軟件都會用到它&#xff09;。“1994年&#xff0c;網景公司(Netscape)發布了Navigator瀏覽器0.9版。這是歷史上第一個比較成熟的網絡瀏覽器&#xff0c;轟動一時。但是&#xff0…

Bun v1.2.19發布,node_modules隔離,sql比node快6倍

大家好,我是農村程序員,獨立開發者,行業觀察員,前端之虎陳隨易。我會在這里分享關于 獨立開發、編程技術、思考感悟 等內容,歡迎關注。 技術群與交朋友請在個人網站聯系我,網站 1??:https://chensuiyi.me,網站 2??:https://me.yicode.tech。 如果你覺得本文有用…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 主頁布局實現

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解主頁布局實現 視頻在線地址&#xff1a; …

# 微調需要準備哪些環境配置?

微調需要準備哪些環境配置&#xff1f; 如果沒有 GPU&#xff0c;即便是微調較小的大語言模型&#xff08;LLMs&#xff09;&#xff0c;過程也會比較慢。如果你已經有了現成的 GPU&#xff0c;那就可以直接開工了。不過&#xff0c;并不是所有人都能負擔得起 GPU—— 這種情況…