千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁  >  應(yīng)聘面試  >  物聯(lián)網(wǎng)面試題  > STL教程(五):C++ STL常用容器之deque

STL教程(五):C++ STL常用容器之deque

來源:千鋒教育
發(fā)布人:syq
時(shí)間: 2022-07-11 17:18:00 1657531080

  1、deque容器的基本概念

  Vector容器是單向開口的連續(xù)內(nèi)存空間,deque則是一種雙向開口的連續(xù)線性空間,又稱雙端動(dòng)態(tài)數(shù)組。所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,當(dāng)然,vector容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,無法被接受。

11

  2、與vector區(qū)別不同

  Deque容器和vector容器最大的差異。

  一在于deque允許使用常數(shù)項(xiàng)時(shí)間對頭端進(jìn)行元素的插入和刪除 操作。

  二在于deque沒有容量的概念,因?yàn)樗莿?dòng)態(tài)的以分段連續(xù)空間組合而成,隨時(shí)可以增加一段新的空間并鏈接起來,換句話說,像vector那樣,”舊空間不足而重新配置一塊更大空間,然后復(fù)制元素,再釋放舊空間”這樣的事情在deque身上是不會(huì)發(fā)生的。也因此,deque沒有必須要提供所謂的空間保留(reserve)功能. 雖然deque容器也提供了Random Access Iterator,但是它的迭代器并不是普通的指針, 其復(fù)雜度和vector不是一個(gè)量級(jí),這當(dāng)然影響各個(gè)運(yùn)算的層面。

  因此,除非有必要,我們應(yīng)該盡可能的 使用vector,而不是deque。對deque進(jìn)行的排序操作,為了最高效率,可將deque先完整的復(fù)制到一個(gè)vector中,對vector容器進(jìn)行排序,再復(fù)制回deque。

  3、deque容器的實(shí)現(xiàn)原理

  Deque容器是連續(xù)的空間,至少邏輯上看來如此,連續(xù)現(xiàn)行空間總是令我們聯(lián)想到array和vector,array 無法成長,vector雖可成長,卻只能向尾端成長,而且其成長其實(shí)是一個(gè)假象,事實(shí)上(1) 申請更大空間 (2)原數(shù)據(jù)復(fù)制新空間 (3)釋放原空間 三步驟,如果不是vector每次配置新的空間時(shí)都留有余裕,其成長假象所帶來的代價(jià)是非常昂貴的。 Deque是由一段一段的定量的連續(xù)空間構(gòu)成。一旦有必要在deque前端或者尾端增加新的空間,便配置一段連續(xù)定量的空間,串接在deque的頭端或者尾端。Deque最大的工作就是維護(hù)這些分段連續(xù)的內(nèi)存空間的整體性的假象,并提供隨機(jī)存取的接口,避開了重新配置空間,復(fù)制,釋放的輪回,代價(jià)就是復(fù)雜的迭代器架構(gòu)。 既然deque是分段連續(xù)內(nèi)存空間,那么就必須有中央控制,維持整體連續(xù)的假象,數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)及迭代器的前進(jìn)后退操作頗為繁瑣。Deque代碼的實(shí)現(xiàn)遠(yuǎn)比vector或list都多得多。 Deque采取一塊所謂的map(注意,不是STL的map容器)作為主控,這里所謂的map是一小塊連續(xù)的內(nèi)存空間,其中每一個(gè)元素(此處成為一個(gè)結(jié)點(diǎn))都是一個(gè)指針,指向另一段連續(xù)性內(nèi)存空間,稱作緩沖區(qū)。緩沖區(qū)才是deque的存儲(chǔ)空間的主體。

12

  4、deque容器常用API

  4.1deque構(gòu)造函數(shù)

deque<T> deqT;//默認(rèn)構(gòu)造形式 deque(beg, end);//構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身。 deque(n, elem);//構(gòu)造函數(shù)將n個(gè)elem拷貝給本身。 deque(const deque &deq);//拷貝構(gòu)造函數(shù)

  4.2deque賦值操作

assign(beg, end);//將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。 assign(n, elem);//將n個(gè)elem拷貝賦值給本身。

deque& operator=(const deque &deq); //重載等號(hào)操作符 swap(deq);// 將deq與本身的元素互換

案例:

#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<deque>

using namespace std;void printDequeInt(deque<int> &d)

 {

     deque<int>::iterator it = d.begin();

    for(;it!=d.end(); it++)

     {

        cout<<*it<<" ";

    }

    cout<<endl;}

void test01(){

 

    deque<int> d1(5,100);

    printDequeInt(d1);

 

    deque<int> d2;

    d2.assign(d1.begin(), d1.begin()+2);

    printDequeInt(d2);

 

    deque<int> d3(5,10);

    printDequeInt(d1);

    printDequeInt(d3);

    

    d1.swap(d3);

    printDequeInt(d1);

    printDequeInt(d3);}int main(){

 

    test01() ;

    return EXIT_SUCCESS;}

13

  4.3deque大小操作

deque.size();//返回容器中元素的個(gè)數(shù)

deque.empty();//判斷容器是否為空

deque.resize(num);//重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置。如果容器變 短,則末尾超出容器長度的元素被刪除。

deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置,如果 容器變短,則末尾超出容器長度的元素被刪除

  4.4deque雙端插入和刪除操作

push_back(elem);//在容器尾部添加一個(gè)數(shù)據(jù) push_front(elem);//在容器頭部插入一個(gè)數(shù)據(jù) pop_back();//刪除容器最后一個(gè)數(shù)據(jù) pop_front();//刪除容器第一個(gè)數(shù)據(jù)

案例:

#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<deque>

using namespace std;void printDequeInt(deque<int> &d)

 {

     deque<int>::iterator it = d.begin();

    for(;it!=d.end(); it++)

     {

        cout<<*it<<" ";

    }

    cout<<endl;}

void test01(){

    deque<int> d1;

    d1.push_back(10);

    d1.push_back(20);

    d1.push_back(30);

    d1.push_front(40);

    d1.push_front(50);

    d1.push_front(60);

    printDequeInt(d1);

 

     //尾部刪除

     d1.pop_back();

     printDequeInt(d1);//60 50 40 10 20

     d1.pop_front();

     printDequeInt(d1);//50 40 10 20

 

     cout<<d1[2]<<endl;//10

     cout<<d1.at(2)<<endl;//10

 

     d1.insert(d1.begin()+2, 3, 100);

     printDequeInt(d1);//50 40 100 100 100 10 20

     d1.erase(d1.begin()+2, d1.begin()+5);

     printDequeInt(d1);//50 40 10 20

 }int main(){

 

    test01() ;

    return EXIT_SUCCESS;}

 

14

  4.5deque數(shù)據(jù)存取

at(idx);//返回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。 operator[];//返回索引idx所指的數(shù)據(jù),如果idx越界,不拋出異常,直接出錯(cuò)。 front();//返回第一個(gè)數(shù)據(jù)。back();//返回最后一個(gè)數(shù)據(jù)。

  4.6deque插入操作

insert(pos,elem);//在pos位置插入一個(gè)elem元素的拷貝,返回新數(shù)據(jù)的位置。 insert(pos,n,elem);//在pos位置插入n個(gè)elem數(shù)據(jù),無返回值。 insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。

  4.7deque刪除操作

clear();//移除容器的所有數(shù)據(jù) erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。 erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個(gè)數(shù)據(jù)的位置。

  5、deque容器使用案例

  有5名選手:選手ABCDE,10個(gè)評(píng)委分別對每一名選手打分,去除最高分,去除評(píng)委中最低分,取平均分。 1. 創(chuàng)建五名選手,放到vector中 2. 遍歷vector容器,取出來每一個(gè)選手,執(zhí)行for循環(huán),可以把10個(gè)評(píng)分打分存到deque容器中 3. sort算法對deque容器中分?jǐn)?shù)排序,pop_back pop_front去除最高和最低分 4. deque容器遍歷一遍,累加分?jǐn)?shù),累加分?jǐn)?shù)/d.size() 5. person.score = 平均分

#include <iostream>#include <string>#include <vector>#include <deque>#include <stdlib.h>//srand rand#include <time.h>//time#include <algorithm>//sortusing namespace std;

 

 class Person

 {

     private:

         string name;

         int score;

     public:

        Person(){}

        Person(string name, int score)

         {

            this>name = name;

            this>score = score;

         }

         void showPerson(void)

         {

            cout<<"姓名:"<<name<<", 分?jǐn)?shù):"<<score<<endl;

         }

         void setScore(int score)

         {

            this>score = score;

         }

 };

 void ceatePlayer(vector<Person> &v)

 {

     int i=0;

     string tmp="ABCDE";

     for(i=0;i<5;i++)

     {

         string name="選手";

         name += tmp[i];

         v.push_back(Person(name, 0));

     }

 }

 void printVectorPerson(vector<Person> &v)

 {

     vector<Person>::iterator it=v.begin();

     for(;it!=v.end();it++)

     {

        (*it).showPerson();

     }

 }

 void playGame(vector<Person> &v)

 {

     //設(shè)置隨機(jī)數(shù)種子

     srand(time(NULL));

     vector<Person>::iterator it=v.begin();

     for(; it!=v.end();it++)

     {

         //*it代表的就是每位選手

         //定義一個(gè)deque容器存放評(píng)委的分?jǐn)?shù)

         deque<int> d;

         int i=0;

         for(i=0;i<10;i++)

         {

             int score = 0;

             score = rand()%41+60;//60~100

             //將評(píng)委的分?jǐn)?shù)放入 d容器中

             d.push_back(score);

         }

 

         //對容器排序(默認(rèn)從小‐‐‐>大排序)

         sort(d.begin(), d.end());

         //去掉一個(gè)最高分

         d.pop_back();

         //去掉一個(gè)最低分

         d.pop_front();

         //求總分?jǐn)?shù)

         int sum = accumulate(d.begin(), d.end(), 0);

         //求平均成績

         int avg = sum/d.size();

         //將平均成績賦值給選手

         (*it).setScore(avg);

     }

 }

 

 int main(int argc, char *argv[])

 {

     vector<Person> v;

     //創(chuàng)建5名選手

     ceatePlayer(v);

 

     //遍歷容器

     printVectorPerson(v);

 

     //參加比賽

     playGame(v);

 

     cout<<"------------"<<endl;

     //遍歷容器

     printVectorPerson(v);

     return 0;

 }

 

15

  更多關(guān)于物聯(lián)網(wǎng)培訓(xùn)的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項(xiàng)目實(shí)操的話可以點(diǎn)擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。

tags:
聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請您保持通訊暢通,專屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
物聯(lián)網(wǎng)公司面試題:保障物聯(lián)網(wǎng)安全的措施有哪些?

題目:請談?wù)勀鷮ξ锫?lián)網(wǎng)安全的理解,以及在物聯(lián)網(wǎng)系統(tǒng)中保障安全性的措施。回答:物聯(lián)網(wǎng)安全是指在物聯(lián)網(wǎng)系統(tǒng)中保護(hù)設(shè)備、數(shù)據(jù)和通信免受未經(jīng)授...詳情>>

2023-07-26 11:59:27
物聯(lián)網(wǎng)中的邊緣計(jì)算是什么?請解釋其優(yōu)勢和應(yīng)用場景

答案:邊緣計(jì)算是一種將計(jì)算和數(shù)據(jù)處理能力移動(dòng)到物聯(lián)網(wǎng)設(shè)備附近的計(jì)算模型。在邊緣計(jì)算中,數(shù)據(jù)的處理和分析發(fā)生在接近數(shù)據(jù)源的設(shè)備或邊緣節(jié)點(diǎn)...詳情>>

2023-07-18 14:15:00
可以介紹一下js的內(nèi)部Date對象功能嗎

提供了操作時(shí)間和日期的方法擁有一系列屬性和方法,可以用來獲取系統(tǒng)當(dāng)前時(shí)間或者設(shè)置 Date 對象中的時(shí)間 通過 getTime()方法可返回距 1970 年 ...詳情>>

2023-01-21 15:51:32
為什么需要三次握手,兩次不行嗎?

弄清這個(gè)問題,我們需要先弄明白三次握手的目的是什么,能不能只用兩次握手來達(dá)到同樣的目的?!〉谝淮挝帐郑嚎蛻舳税l(fā)送網(wǎng)絡(luò)包,服務(wù)端收到了。...詳情>>

2022-10-25 16:55:00
什么是半連接隊(duì)列?

服務(wù)器第一次收到客戶端的 SYN 之后,就會(huì)處于 SYN_RCVD 狀態(tài),此時(shí)雙方還沒有完全建立其連接,服務(wù)器會(huì)把此種狀態(tài)下請求連接放在一個(gè)隊(duì)列里,...詳情>>

2022-10-25 16:55:00
快速通道