二、容器的選擇
三、容器的操作
容器就是特定型別物件的集合。順序容器為程式設計師提供了控制元素儲存和訪問順序的能力,這種順序不依賴於元素的值,而是與元素加入容器時的位置相對應。相比於陣列,它可以很隨意的實現元素的新增、刪除等,我們也無需擔心記憶體分配的問題。
要使用容器,必須包含相應的標頭檔案
#include
// vector
#include
// list
#include
// deque
vector vec;
// empty vector that can hold strings
list<
int> lis;
// empty list that can hold ints
deque<
float
> dequ;
// empty deque that can holds floats
構造方法
含義c<t> c
建立乙個名為c的空容器,c是容器型別名,如vector,t是元素型別,如int,string。
c c (c2)
建立容器c2的副本c;c2和c必須具有相同的容器型別,並存放相同型別的元素。:
c c(n,m)
建立有n個初始化元素為m的容器c。只適用順序容器
c c(n, t)
使用n個為t的元素建立容器c,其中值t必須是容器型別c的元素型別的值。
c <t> c
建立容器c,容器中元素型別為t,並進行初始化
每種順序容器都提供了一組有用的型別定義以及以下操作:
型別別名
含義iterator
此容器型別的迭代器
const_iterator
可以讀取元素,但不能修改元素的迭代器型別
size_type
無符號整數型別,足夠儲存此種容器型別最大可能容器大小
difference_type
帶符號整數型別,足夠儲存兩個迭代器之間的距離
value_type
元素型別
reference
元素的左值型別,是value_type&的同義詞
const_reference
元素的常量左值型別
(1)、定義:我們可以通過下標運算子來訪問物件,但還有一種更通用的機制,就是迭代器。迭代器類似於指標,可以使用迭代器來訪問容器裡的元素,迭代器也能從乙個元素移動到另乙個元素。迭代器有有效和無效之分,有效的迭代器指向某個元素,或指向容器中尾元素的下一位置,其他的情況下就是無效的迭代器。
(2)、迭代器的使用
通過容器型別的begin和end成員使用迭代器
操作功能
c.begin()
返回乙個迭代器,指向容器c的第乙個元素
c.end()
返回乙個迭代器,指向容器c的最後乙個元素的下乙個位置
迭代器的運算子
符號作用
*iter
返回迭代器iter所指元素的引用,我們還可以對迭代器裡的值進行修改(非const迭代型別)
++iter/ - -iter
iter1==iter2/-iter1!=iter2
判斷兩個迭代器是否相等/不相等
示例1:輸出: 2 6 4 5
vector <
int> l1;
l1=;
vector <
int>
::iterator iter1=l1.
begin()
;while
(iter1!=l1.
end())
}
示例2:報錯,無法修改數值,迭代器為const_literator型別,只能讀,不能寫,輸出1,5,3,4
vector <
int> l1;
l1=;
for(vector <
int>
::const_iterator iter1=l1.
begin()
;iter1!=l1.
end();
++iter1)
}
幾個常用的成員函式
函式作用
push_back()
向容器末尾插入
swap(c1,c2)
交換c1,c2的元素,前提是型別相同,除了array容器,交換後迭代器不會失效,仍指向原來指向的元素
seq.assign(b,e)
將seq中的元素替換為迭代器b,e所表示的範圍中的元素。b,e不能指向seq中元素
seq.assign(n,t)
將seq中元素替換為n個值為t的元素
insert(iter,t)
將元素t插入到iter指向的元素之前的位置
insert(iter,b,e)
在iter指向的元素之前插入迭代器b,e所表示範圍中的元素(這個是左閉右開的區間範圍)
示例1:swap操作vector容器,交換後的迭代器還是指向原來的元素,此時輸出為:1,5,3,4
vector <
int> l1;
l1=;
vector <
int> l2=
;auto iter2=l1.
end();
for(
;iter1!=iter2;
++iter1)
示例2:swap操作array容器,交換後的迭代器指向原來的位置,但元素變了,輸出為:99,2,4,8
array <
int,
4> l1;
l1=;
array <
int,
4> l2=
;array <
int,
4>
::iterator iter1=l1.
begin()
;auto iter2=l1.
end();
swap
(l1,l2)
;for
(;iter1!=iter2;
++iter1)
insert使用後會有乙個返回值,該返回值指向第乙個新加入元素的迭代器
vector st1=
;vector st2=
;vector
::iterator iter=st1.
begin()
;auto st3=st2.
insert
(st2.
end(
),iter,iter+2)
;//向st2某位置插入元素,並通過insert返回乙個指向第乙個新插入元素位置的迭代器
cout<<
*st3/此處輸出為v1,說明了返回的迭代器指向的位置
for( vector
::iterator iters=st2.
begin()
;iters!=st2.
end();
++iters)
cout<<
*iters/輸出為c1 c2 c3 v1 v2,說明迭代器範圍是乙個左閉右開的區間
參考文章
1.2.《c++ primer第五版》
C 標準庫 順序容器
容器是容納特定型別物件的集合。順序容器將單一型別元素聚集起來,並且根據位置來儲存和訪問這些元素。順序容器中元素排列順序與元素值無關,而是根據元素值新增到容器中的次序決定的。標準庫中有三種順序容器,分別是vector,list與deque。其中vector支援隨機的快速訪問,因為vector中存放資料...
C 標準庫順序容器知識點總結
c 具有內建資料結構,但為了更好的滿足開發者的需求,c 標準庫提供了多種容器來供程式設計師呼叫,本篇部落格主要是順序容器的相關知識點總結 在c 中,容器主要是一些特定型別的集合,順序容器為程式設計師提供儲存和順序訪問的能力,主要的容器型別有vector deque list forward list...
C 標準庫關聯容器
1 關聯容器定義 儲存物件集合的型別,支援通過鍵的高效訪問。和順序容器的本質差別在於 順序容器通過元素在容器中的位置順序儲存和訪問元素,而關聯容器卻是依靠鍵。map和set是兩個基本的關聯容器型別,map以鍵值對的形式組織儲存元素,而set僅儲存鍵。2,pair型別 在utility標頭檔案中定義 ...