C primer 第九章順序容器!

2021-08-25 17:53:59 字數 1727 閱讀 7082

標準庫定義了3種順序容器:vector支援隨機訪問,    

list支援快速插入刪除,  

deque雙端佇列。

他們的差別在於訪問元素的方式,以及新增或刪除元素操作的執行代價。

1. 容器元素的初始化

預設的建構函式:listilist; list容器,裡面內容是int型別的內容

dequeitems; 空容器deque,裡面裝的是sales_item型別的 。

除了預設的建構函式,容器型別還提供了其他的建構函式,可以用這些建構函式指定元素初值:

cc;建立乙個名為c的空容器。c是容器型別名,如vector,t是元素型別,如int或string適用於所有容器。

c c(c2);建立容器c2的副本c;c和c2必須具有相同的容器型別,並存放相同型別的元素,適用於所有容器

還有類似幾種建構函式如c c(b,e);c c(n,t); c c(n)

1將乙個容器初始化為另乙個容器的副本,當不適用預設建構函式,而是用其他建構函式初始化順序容器時,必須指出該容器有多少個元素,並提供這些元素的初值 。同時指定元素個數和初值的乙個方法是將新建立的容器初始化為乙個同型別的已存在容器的副本:vectorivec;vectorivec2(ivec);

2初始化為一段元素的副本,儘管不能直接將一種容器內的元素複製給另一種容器,但系統允許通過傳遞一對迭代器 間接實現該功能。使用迭代器時,不要求容器型別相同。容器內的元素型別也可以不相同,只要他們相互相容,能夠將要複製的元素轉換為所構建的新容器的元素型別,即可實現複製。迭代器標記了要複製的元素範圍,這些元素用於初始化新容器的元素。迭代器 標記出要複製的第乙個元素和最後乙個元素。採用這種初始化形式可複製不能直接複製的容器。更重要的是,可以事先複製其他容器的乙個子串行:

回顧一下指標,我們知道指標就是迭代器,因此允許通過使用內建陣列中的一堆指標初始化容器也就不奇怪了:

3分配和初始化指定數目的元素,建立順序容器時,可顯示指定容器大小和乙個(可選的)元素初始化式。我們也可以只指定容器的大小:listilist(list_size);

在容器中新增元素:c.push_back(t)在容器末尾加上t元素,返回值是void  

c.push_front(t)只有list和deque容器能使用返回值是void 

c.insert(p,t)在p迭代器指向的位置前面加上元素t,返回指向新元素的迭代器

c.insert(p,n,t)在迭代器p所指向的位置前面加入n個值為t的元素,返回void型別

c.insert(p,b,e)在迭代器p所指向的位置前面,加入由迭代器b,e所標記範圍內的元素,返回void型別

關係操作符:所有容器都支援用關係操作符來實現兩個容器比較,比較的兩個容器型別要相同,其元素型別也要相同。容器的比較是基於容器元素的比較。如果容器內的元素不支援某種操作符,則該類容器就不能做此種比較。

c.size() 返回c中元素的個數,返回型別為c::size_type

c.max_size()返回容器c可容納的最多元素個數,返回型別為c::size_type

c.empty()返回標記容器大小是否為0的布林值

c.resize(n)調整容器c的長度大小,使其能容納n個元素,如果nc.resize(n,t)調整容器c的長度大小,時期能容納n個元素,所有新新增的元素值都為t

元素的訪問:訪問順序容器內元素的操作

c.back()

c.front()

c[n]

c.at(n)

刪除元素

賦值與swap

vector容器的自增長

C Primer 第九章 順序容器

接受容器大小引數的順序容器建構函式使用了元素的預設建構函式 forward lis迭代器不支援 運算子 使用迭代器引數來拷貝乙個範圍時,就不要求容器型別相同了 array型別可以進行拷貝和賦值,但是要求元素型別和大小一樣 array型別不支援assign,也不允許用花括號的值列表進行賦值 swap一...

c primer 筆記 第九章 順序容器

1.vector,deque,list,forward list,array,string的區別 vector 可變大小陣列,支援快速隨機訪問,在尾部之外的位置插入或刪除元素可能很慢 deque 雙端佇列,支援快速隨機訪問,在中間位置新增或刪除元素的代價可能很高,但是在兩端新增或刪除元素很快 lis...

第九章 順序容器

1 容器必須支援的2種操作,這種型別才能作為容器的元素 一是元素型別支援賦值操作,而是元素型別支援物件複製操作 2 操作特殊需求,例如容器元素型別為類型別,該類只提供了單值初始化建構函式,則不能用vec n 的操作了,因為無法給類型別初始化,這是由於沒有預設建構函式導致的。但是可以vec n,1 3...