C++primer第九章 顺序容器 9.6 容器适配器
生活随笔
收集整理的這篇文章主要介紹了
C++primer第九章 顺序容器 9.6 容器适配器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
9.6容器適配器
- 除了順序容器外,標(biāo)準(zhǔn)庫(kù)還定義了三個(gè)順序容器適配器:stack、queue和priority_queue
- 適配器(adaptor)是標(biāo)準(zhǔn)庫(kù)中的一個(gè)通用概念。容器、迭代器和函數(shù)<369I
- 都有適配器。本質(zhì)上,一個(gè)適配器是一種機(jī)制,能使某種事物的行為看起來(lái)像另外一種事物一樣。一個(gè)容器適配器接受一種已有的容器類型,使其行為看起來(lái)像一種不同的類型。
- 例如,stack適配器接受一個(gè)順序容器(除array或forward_list外),并使其操作起來(lái)像一個(gè)stack一樣(外層包裝)。表9.17列出了所有容器適配器都支持的操作和類型。
定義一個(gè)適配器
- 每個(gè)適配器都定義兩個(gè)構(gòu)造函數(shù):默認(rèn)構(gòu)造函數(shù)創(chuàng)建一個(gè)空對(duì)象,接受一個(gè)容器的構(gòu)造函數(shù)拷貝該容器來(lái)初始化適配器。例如,假定deq是一個(gè)deque<int>,我們可以用deq來(lái)初始化一個(gè)新的stack,如下所示:
- stack<int>stk(deq);//從deq拷貝元素到stk
- 默認(rèn)情況下,stack和queue是基于deque實(shí)現(xiàn)的,priority_queue是在vector之上實(shí)現(xiàn)的。我們可以在創(chuàng)建一個(gè)適配器時(shí)將-個(gè)命名的順序容器作為第二個(gè)類型參數(shù),來(lái)重載默認(rèn)容器類型。
- //在vector_h實(shí)現(xiàn)的空棧
- stack<string,vector<string>> str_stk;
- stack<string,vector<string>>str_stk2(svec);? ?//str_stk2在vector上實(shí)現(xiàn),初始化時(shí)保存svec的拷貝
- 對(duì)于一個(gè)給定的適配器,可以使用哪些容器是有限制的。所有適配器都要求容器具有添加和刪除元素的能力。因此,適配器不能構(gòu)造在array之上。類似的,我們也不能用forward_list來(lái)構(gòu)造適配器,因?yàn)樗羞m配器都要求容器具有添加、刪除以及訪問(wèn)尾元素的能力。
- stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器類型來(lái)構(gòu)造stack。
- queue適配器要求back、push_back、front和push_front,因此它可以構(gòu)造于list或deque之上,但不能基于vector構(gòu)造。
- priority_queue除了front、push_back和pop_back操作之外還要求隨機(jī)訪問(wèn)能力,因此它可以構(gòu)造于vector或deque之上,但不能基于list構(gòu)造。
棧適配器
- stack類型定義在stack頭文件中。表 9.18列出了 stack所支持的操作。下面的 程序展示了如何使用stack:
- stack<int> intStack; // 空棧
- / / 填滿棧
- for (size_t ix = 0; ix != 10; ++ix)
- intStack.push (ix) ; // intStack 保存 0 到 9 十個(gè)數(shù)
- while (! intStack. empty () ) ( // intStack 中有值就繼續(xù)循環(huán)
- int value = intStack.top();
- / / 使用棧頂值的代碼
- intStack.pop () ; / / 彈出棧頂元素,繼續(xù)循環(huán)
- }
- 其中,聲明語(yǔ)句
- stack<int> intStack; // 空棧
- 定義了一個(gè)保存整型元素的棧intStack,初始時(shí)為空。for循環(huán)將10個(gè)元素添加到棧 中,這些元素被初始化為從0 開(kāi)始連續(xù)的整數(shù)。while循環(huán)遍歷整個(gè)stack,獲取top 值,將其從棧中彈出,直至棧空。
- 每個(gè)容器適配器都基于底層容器類型的操作定義了自己的特殊操作。我們只可以使用適配器操作,而不能使用底層容器類型的操作。例如,
- intStack.push(ix);//intStack保存0到9十個(gè)數(shù)
- 此語(yǔ)句試圖在intStack的底層deque對(duì)象上調(diào)用push_back
- 雖然stack是基于deque實(shí)現(xiàn)的,但我們不能直接使用deque操作。不能在一個(gè)stack調(diào)用push_back,而必須使用stack自己的操作push
隊(duì)列適配器
- queue和 priority_queue適配器定義在queue頭文件中。表 9.19列出了它們所支持的操作。
- 標(biāo)準(zhǔn)庫(kù)queue使用一種先進(jìn)先出(first-in,first-out,FIFO)的存儲(chǔ)和訪問(wèn)策略。進(jìn)入隊(duì)列的對(duì)象被放置到隊(duì)尾,而離開(kāi)隊(duì)列的對(duì)象則從隊(duì)首刪除。飯店按客人到達(dá)的順序來(lái)為他們安排座位,就是一個(gè)先進(jìn)先出隊(duì)列的例子。
- priority_queue允許我們?yōu)殛?duì)列中的元素建立優(yōu)先級(jí)。新加入的元素會(huì)排在所有優(yōu)先級(jí)比它低的已有元素之前。飯店按照客人預(yù)定時(shí)間而不是到來(lái)時(shí)間的早晚來(lái)為他們安排座位,就是一個(gè)優(yōu)先隊(duì)列的例子。默認(rèn)情況下,標(biāo)準(zhǔn)庫(kù)在元素類型上使用〈運(yùn)算符來(lái)確定相對(duì)優(yōu)先級(jí)。我們將在11.2.2節(jié)(第378頁(yè))學(xué)習(xí)如何重載這個(gè)默認(rèn)設(shè)置。
小結(jié)
- 標(biāo)準(zhǔn)庫(kù)容器是模板類型,用來(lái)保存給定類型的對(duì)象。在一個(gè)順序容器中,元素是按順序存放的,通過(guò)位置來(lái)訪問(wèn)。順序容器有公共的標(biāo)準(zhǔn)接口:如果兩個(gè)順序容器都提供一個(gè)特定的操作,那么這個(gè)操作在兩個(gè)容器中具有相同的接口和含義。
- 所有容器(除arrav外)都提供高效的動(dòng)態(tài)內(nèi)存管理。我們可以向容器中添加元素,不必?fù)?dān)心元素存儲(chǔ)在哪里。容器負(fù)責(zé)管理自身的存儲(chǔ)。vector和string都提供更細(xì)致的內(nèi)存管理控制,這是通過(guò)它們的reserve和capacity成員函數(shù)來(lái)實(shí)現(xiàn)的.
- 很大程度,容器只定義了極少的操作。每個(gè)容器都定義了構(gòu)造函數(shù)、添加和刪除元素的操作、確定容器大小的操作以及返回指向特定元素的迭代器的操作。其他一些有用的操作,如排序或搜索,并不是由容器類型定義的,而是由標(biāo)準(zhǔn)庫(kù)算法實(shí)現(xiàn)的,我們將在第I0章介紹這些內(nèi)容。
- 當(dāng)我們使用添加和刪除元素的容器操作時(shí),必須注意這些操作町能使指向容器中元素的迭代器、指針或引用失效。很多會(huì)使迭代器失效的操作,如insert和erase,都會(huì)返回一個(gè)新的迭代器,來(lái)帶助程序員維護(hù)容器中的位置。如果循環(huán)程序中使用了改變?nèi)萜鞔笮〉牟僮?#xff0c;就要尤其小心其中迭代器、指針和引用的使用。
術(shù)語(yǔ)表
- 適配器(adaptor)標(biāo)準(zhǔn)陣類型、函數(shù)或送代器,它們接受一個(gè)類型、函數(shù)或迭代器,使其行為像另外一個(gè)類型、函數(shù)或迭代器-樣。標(biāo)準(zhǔn)應(yīng)提供了:一種順序容器適配器:stack,queue和priority_queue每個(gè)適配器都在其底層順序容器類型之上定義了一個(gè)新的接口。
- 數(shù)組(array)固定大小的順序容器。為了定義一個(gè)array,除了元素類型之外還必須給定大小.array中的元素可以用其位置下標(biāo)來(lái)訪問(wèn)。array支持快速的隨機(jī)訪問(wèn)
- begin容器操作,返回個(gè)指向容器首元素的迭代器,如果容器為空,則返回尾后迭代器。是否返回const迭代器依賴于容器的類型。
- cbegin容器操作,返回一個(gè)指向容器首元素的const_iterator,如果容器為空,則返回尾后迭代器
- cend容器操作,返回個(gè)指向容器尾元素之后(不存在:的)的const_iterator.
- 容器 container 保存-組給定類型對(duì)象的類型。每個(gè)標(biāo)準(zhǔn)庫(kù)容器類型都是一個(gè)模板類型。為了定義一個(gè)容器,我們必須指定保存在容器中的元素的類型。除了array之外,標(biāo)準(zhǔn)庫(kù)容器都是大小可變的。
- deque順序容器。deque中的元素可以通過(guò)位置下標(biāo)來(lái)訪問(wèn)。支持快速的隨機(jī)訪問(wèn)。deque各方面都和vector類似,唯一的差別是,deque支持在容器頭尾位置的快速插入和刪除,而目.在兩端插入或刪除元素都不會(huì)導(dǎo)致重新分配空間.
- end容器操作,返回-個(gè)指向容器尾元素之后(不存在的)元素的迭代器。是否返回const迭代器依賴于容器的類型
- forward_ist順序容器,表示一個(gè)單向鏈表。forward_listr的元素只能順序訪問(wèn)。從一個(gè)給定元素開(kāi)始,為了訪問(wèn)另-個(gè)元素,我們只能遍歷兩者之間的所有元素。forward_list上的迭代器不支持遞減運(yùn)算(一).forward_list支持任意位置的快速插入(或刪除)操作。與其他容器不同,插入和刪除發(fā)生在一個(gè)給定的迭代器之后的位置。因此,除了通常的尾后迭代器之外,forward_list還有一個(gè)“首前”迭代器。在添加新元素后,原有的指向forward_list的迭代器仍有效。在刪除元素后,只有原來(lái)指向被刪元素的迭
- 代器才會(huì)失效。
迭代器范圍(iteratorrange)由一對(duì)迭代器指定的元素范圍。第一個(gè)迭代器表示序列中第一個(gè)元素,第二個(gè)迭代器指向最后-個(gè)元素之后的位置。如果范圍為空,則兩個(gè)迭代器是相等的(反之亦然,如果兩個(gè)迭代器不等,則它們表示一個(gè)非空范圍).如果范圍非空,則必須保證,通過(guò)反復(fù)遞增第一個(gè)迭代器,可以到達(dá)第二個(gè)迭代器。通過(guò)遞增迭代器,序列中每個(gè)元素都能被訪問(wèn)到。 - 左閉合區(qū)間(left-inclusiveinterval)值范圍,包含首元素,但不包含尾元素。通常表示為[i,j)表示序列從i開(kāi)始(包含)直至j結(jié)束(不包含)。list順序容器,表示一個(gè)雙向鏈表。list中的元素只能順序訪問(wèn)。從一個(gè)給定元素開(kāi)始,為了訪問(wèn)另一個(gè)元素,我們只能遍歷兩者之間的所有元素。list上的迭代器既支持遞增運(yùn)算(++),也支持遞減運(yùn)算(--)olist支持任意位置的快速插入(或刪除)操作。當(dāng)加入新元素后,迭代器仍然有效。當(dāng)刪除元素后,只有原來(lái)指向被刪除元素的迭代器才會(huì)失效。
- 首前迭代器(off-the-beginningiterator)表示一個(gè)forwardlist開(kāi)始位置之前(不存在的)元素的迭代器。是forward_list的成員函數(shù)before_begin的返回值。與end()迭代器類似,「不能被解引用。
- 尾后迭代器(off-the-enditerator)表示范圍中尾元素之后位置的迭代器。通常被稱為“末尾迭代器"(enditerator)。
- priority_queue順序容器適配器,生成一個(gè)隊(duì)列,插入其中的元素不放在末尾,而是根據(jù)特定的優(yōu)先級(jí)排列。默認(rèn)情況下,優(yōu)先級(jí)用元素類型上的小于運(yùn)算符確定。
- queue順序容器適配器,生成一個(gè)類型,使我們能將新元素添加到末尾,從頭部刪除元素。
- 順序容器(sequentialcontainer)保存相同類型對(duì)象有序集合的類型。順序容器中的元素通過(guò)位置來(lái)訪問(wèn)。
- stack順序容器適配器,生成一個(gè)類型,使我們只能在其一端添加和刪除元素。
- vector順序容器。vector中的元素可以通過(guò)位置下標(biāo)訪問(wèn)。支持快速的隨機(jī)訪問(wèn)。我們只能在vector末尾實(shí)現(xiàn)高效的元素添加/刪除。向vector添加元素可能導(dǎo)致內(nèi)存空間的重新分配,從而使所有指向vector的迭代器失效。在vector內(nèi)部添加(或刪除)元素會(huì)使所有指向插入(刪除)點(diǎn)之后元素的迭代器失效
總結(jié)
以上是生活随笔為你收集整理的C++primer第九章 顺序容器 9.6 容器适配器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 802.11k/v/r WiFi无缝漫游
- 下一篇: C++ primer第六章6.5函数的学