序列式容器
他們的排列順序和輸入的順序一致,stl中有三個常用序列式容器:vector
,deque
,list
;
vector
允許隨機訪問,也就是可以直接利用索引進行訪問任何元素,但在頭部和中部進行訪問較為耗時,優勢是在尾部附加元素或者移除元素效率極高,實現如:
#include
#include
//標頭檔案
using namespace std;
intmain()
其中size()
為序列式容器共有的函式;
可以通過[ ]
下標倆訪問指定元素;
deque
即所謂的雙向佇列,在尾部和頭部插入元素效率極高,這是他的優勢,而不足在於在中間插入元素耗時長,實現如:
#include
#include
//標頭檔案
using namespace std;
intmain()
for(
int i =
0;i < arry.
size()
;i++
) cout<< arry[i]
<<
" ";
return0;
}
其中push_front()
用於在佇列頭部插入元素;
list
即雙向鍊錶,優勢在於在任何位置執行插入和刪除效率極高,劣勢在於隨機訪問不行;
#include
#include
//標頭檔案
using namespace std;
intmain()
return0;
}
關聯式容器
關聯式容器通常都是由二叉樹實現,左子樹的節點值都比父節點小,右節點值都比父節點值大。常見:set
,multiset
,map
,multimap
這四個容器。
setset
的內部元素一句其值自動排序,每乙個元素只能出現一次,不允許重複。
multiset
multiset
和set
類似,但是允許出現重複的值。
實現如:
#include
#include
using namespace std;
intmain()
所有關聯容器都有insert
函式,提供元素插入功能。
但還要強調一下insert
函式,而在容器中其他用法:
在指定位置it前「插入」值為val的元素,返回指向這個元素的迭代器,
iterator insert( iterator it, const type &val );
在指定位置it前「插入」num個值為val的元素
void insert( iterator it, size_type num, const type &val );
在指定位置it前「插入」區間[start, end)的所有元素.
void insert( iterator it, input_iterator start, input_iterator end );
mapmap
的元素是以一對數的形式存在,即(key,value)
,每乙個元素都按照鍵值key
進行排序,並且每乙個鍵值只允許出現一次。
multimap
multimap
和map
類似,但是允許鍵值重複。
實現如:
#include
#include
using namespace std;
intmain()
其中make_pair
的功能就是生成(key,value)
元素;
其中內含指標first
指向鍵值,second
指向存的值。
當然map
容器,除了以上形式,還有一種直接賦值或者產生元素的形式,map可以是以operaator[ ]
,其中下標是鍵值,賦值的是存的值,也叫關聯式陣列,如:
#include
#include
using namespace std;
intmain()
使用以上形式,值得一提的是我們當我們插入乙個值如arry[10] = 1
但是map
容器中沒有arry[10]
,此時會產生乙個新的元素,加入容器中,即arry[10] = 1
;而mulltimap
容量不能使用,因為他會出現一對多的情況,即乙個下標,對應多個儲存值。
容器配接器
stack
,queue
,priority_queue
其中stack
容器遵循lifo
原值,即後進先出,(棧)。
queue
普通佇列,遵循fifo
先入先出原值。
priority_queue
優先佇列,元素優先權由排序準則決定,如operator<
即給乙個按照從小到大的準則排列,賦予優先權即可。
迭代器迭代器是乙個可遍歷stl
容器全部元素的物件,可以指向任何存在的位置,相當於c language
中的指標,但是呢,在stl裡,我們不能以指標來看待迭代器,指標是與記憶體繫結的,而迭代器是與容器裡的元素繫結的,刪除了之後,該迭代器就失效了,在對其重新賦值之前,不能再訪問此迭代器。
迭代器分為以下兩類:
**雙向迭代器:**雙向迭代器可以雙向進行,有list
,set
,multimap
,map
,multiset
的迭代器都是這類。
**隨機訪問迭代器:**可以進行隨機訪問。
常用於迭代器的操作的有以下內容:
operator *
:返回當前位置上的元素值;
operator ++
:將迭代器向後移動一位;
operator == and operator !=
判斷迭代器是否指向同乙個位置;
operator=
:為迭代器賦值,即給他乙個位置指向,路標?
另外,與迭代器搭配的幾個函式
begin()
:指向容器的起點;
end()
:指向容器的結束點,即最後乙個元素的下乙個位置;
判斷容器是否為空時,除了前文介紹的empty(),size()
外,還有begin() == end()
相等時也是為空的。
而任何乙個容器都有兩種迭代器型別:
container::iterator
是可讀可寫模式,可以修改容器中的元素值;
container::const_iterator
是唯讀模式,不可修改容器中的元素值;
還需注意的是,在我們利用迭代器進行迴圈的時候,一般採用前置的遞增++pos
,因為後置的還需要額外多乙個臨時物件,這個有一點的c++程式設計經歷的同學應該都知道的,形如一下實現
container operarot++
(int)(
)
當處理vector
,deque
時,當在乙個迴圈中可能增加或移除元素時,要考慮到迭代器可能會失效的問題。
此外,還有乙個reverse_iterator
即反向迭代器,常於rbegin()
,和rend()
搭配使用。
C STL筆記(1 容器)
c 的stl基本用法。c stl standard template library,即標準模板庫 中最基本以及最常用的類或容器如下 stl的最主要的兩個特點 資料結構和演算法的分離,非物件導向本質。訪問物件是通過象指標一樣的迭代器實現的 容器是象鍊錶,向量之類的資料結構,並按模板方式提供 演算法是...
容器類總覽
1.vector 1 random access 即得到第i個元素所花的時間為常數,與i無關。2 varying length 即長度可變,stl容器的共性,由庫管理記憶體 3 amortized constant time insertion and deletions at the end 即在...
c STL 容器 聯合容器
stl提供了四種聯合容器 set,multiset,map,multimap set and multiset在標頭檔案 map and multimap在標頭檔案 模板函式都一樣的 set map中迭代器不能 或 因為不是連續的序列,是樹。set 在set中,值就是關鍵字,集合中不會有多個相同的關...