STL1——順序容器和順序容器適配器

容器

       容器是容納特定類型對象的集合,容器的類型分爲順序容器,容器適配器和關聯容器,順序容器將單一類型元素聚集起來成爲容器,然後根據位置來存儲和訪問這些元素。

       順序容器的元素排列次序與元素值無關,而是由元素添加到容器裏的次序決定。標準庫定義了三種順序容器類型:vector,list和deque。他們得差別在於訪問元素的方式,以及添加或刪除元素相關操作的運行代價。

       適配器是根據原始容器類型所提供的操作,通過定義新的操作接口,來適應基礎的容器類型。順序容器適配器包括stack,queue和priority_queue類型。




       標準庫還定義了幾種關聯容器,其元素按照key排序。

       標準庫爲容器類型定義的操作強加了公共的接口。這些容器類型的差別在於他們提供哪些操作,但如果兩個容器提供了相同的操作,則他們的接口(函數名和參數個數)相同。容器類型的操作集合層次如下

       1.一些操作適用於所有容器類型;

       2.一些操作只適用於順序或關聯容器類型的一個子集;

       3.一些操作只適用於順序或關聯容器類型類型的一個子集;


順序容器

順序容器的初始化以及定義

使用順序容器首先要包含頭文件:

#include<vector>
#include<list>
#include<deque>

順序容器的定義

vector<int> vec;//所有容器是模板
list<int> lis;//<>中提供容器中存放的元素的類型,可以是常用數據類型也可以是自己定義的類類型</span>
deque<int> items;//容器類型都定義了默認構造函數用於創建指定類型的空容器對象,默認構造函數不帶參數


順序容器的初始化



vector<int> vec;//定義包含int型元素的容器
vector<int> vec1(10);//包含10個int型元素的容器
vector<int> vec2(10,1);//包含10個int型元素的容器每個被初始化爲1,只適用於順序容器
vector<int> vec3(vec2);//將vec2中的元素複製到vec3,只適用於順序容器


不能直接將一種容器中的元素賦值給另一種容器,但是可以使用傳遞一對迭代器間接實現該功能

vector<string> svec;
list<string> ilist(svec);//容器不同,不能複製
list<string>slist(svec.begin(),svec.end());//使用迭代器,不要求容器類型相同

注:除引用類型外,所有內置或複合類型(包括容器類型本身)都可以用做元素類型,IO庫類型不能夠作爲容器類型;

        當使用類類型作爲元素類型,如果指定了容器的大小,則必須提供單個初始化式的構造函數。

vector< <vector<string> >lines;

順序容器的操作


順序容器的類型別名







begin和end成員


       所有容器都提供begin和end操作符,用於返回迭代器,begin返回迭代器指向的第一個元素,end返回迭代器指向的容器末端的元素下一個,它指向一個不存在的元素,當容器爲空,兩個操作符返回的值相等。




容器中添加元素


容器支持以下操作添加新元素:


       任何insert和push操作可能導致迭代器失效,當編寫程序時,程序必須確保迭代器在每次插入操作後更新。要避存儲end操作返回的迭代器。



關係操作符


       所有容器都支持關係操作符來比較容器中的元素,比較時,容器類型,容器中元素的類型都必須相同。容器比較是基於容器內元素的比較,即其內部元素類型定義的比較操作。如果容器的元素類型不支持某種操作符,則該容器不能做比較運算。


容器大小操作




訪問元素




刪除元素




賦值和swap

       使用賦值操作符時,賦值前兩容器長度可以不相等,但賦值後兩容器都具有右操作數的長度。

       =和assign會使左操作數容器的所有迭代器失效,swap不會。

       assign可以實現類型不同但相互兼容的元素的賦值。

       swap實現交換兩個容器內所有元素的功能,要交換的容器類型必須匹配,操作數必須是相同類型的容器,而且所存儲的元素類型也必須相同。




capacity和reserve

       由於vector元素以連續方式存放,當添加了新元素,但是容器中已經沒有容納新元素的空間,就回重新分配內存空間,將就空間的存儲的元素複製進去,接着插入 新元素,最後撤銷舊的存儲空間。爲了使vector實現快速內存分配,其實際分配的容量要比當前所需的空間多一些。

       vector提供兩個成員函數capacity和reserve來與容器的內存分配實現交互。

       capacity操作獲取在容器需要分配更多存儲空間之前能夠存儲的元素總數,通常比size要大。

       reserve操作告訴容器應該預留多少個元素的存儲空間。


容器適配器

       適配器是使一個事物的行爲類似於另一個事物的行爲的一種機制,適配器讓一種已存在的容器類型採用另一種不同的抽象類型的工作方式實現。如:stack可使任何一種順序容器以棧的方式實現。

       使用適配器必須包含頭文件

#include<stack>
#include<queue>


容器適配器的通用操作和類型




適配器的初始化

       所有適配器都有兩個構造函數1.默認構造函數:常見空對象2.帶一個容器參數的構造函數:將參數容器的副本作爲基礎值

deque<int>deq;
stack<int>stk(deq);


覆蓋基礎容器類型

       默認的stack和queue都是基於deque容器實現,而priority_queue則在vector容器上實現。

       如果要覆蓋其關聯的容器類型,可通過將一個順序容器指定爲適配器的第二個類型實參:

stack< string,vector<string> >str_stk;

      對於給定的適配器,關聯的容器必須滿足一定的約束條件

      stack可以關聯所有的順序容器;

      queue要求關聯的容器支持push_front,因此只能建立在list和deque上;

      priority_queue要求提供隨機訪問功能,因此只建立在vector和deque上;


棧適配器

棧的操作如下:


         所有的容器適配器都依據其基礎容器類型所支持的操作來定義自己的操作,比如,stack建立在deque容器上,因此採用deque提供的操作來實現棧功能。


隊列和優先隊列

       priority_queue允許用戶爲隊列中存儲的元素設置優先級,這種隊列不是直接將新元素放置在隊列尾部,而是放在比它優先級低的元素前面。







迭代器和迭代器操作

       迭代器是一種檢查容器內部元素並且遍歷元素的數據類型,標準庫爲每一種標準容器定義了一種迭代器類型,如vector迭代器:

vector<int>::iterator iter

       所有迭代器都具有相同的接口,例如迭代器可使用解引用操作符(*操作符)來訪問迭代器所指向的元素

*iter=0//將iter指向的值設爲0.

      下表迭代器爲所有標準庫容器類型所提供的運算



       deque和vector還提供了額外的操作符



       vector和deque這兩種容器爲其元素提供快速隨機訪問,而list只支持自增自減以及相等不等運算。

       const_iterator

       該類型只能用於讀取容器內元素但不能改變其值。


各種容器的比較

       vector:提供元素的隨機訪問,除容器尾部外,在容器任何其他位置上插入(或刪除)操作都要求移動被插入(或刪除)元素右邊的所有元素。

       list:表示不連續的內存區域,可高效的在任何位置插入和刪除一個元素,但是不支持隨機訪問

       deque:在deque隊列的兩端插入和刪除元素非常快,同時deque具有以下性質:1.在容器中間插入或刪除效率比較低;2.可高效地在其首部實現插入和刪 除,就像在容器尾部 一樣;3.支持對所有元素的隨機訪問;4.在容器首部或尾部插入元素不會使任何迭代器失效,而在首部或者尾部刪除則會使指向被刪除元素的迭代器時效,在任何其他位置的插入和刪除操作將使指向該容器元素的所有迭代器都失效。








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章