c STL 1 容器總覽

2021-10-03 08:11:11 字數 4220 閱讀 3363

序列式容器

他們的排列順序和輸入的順序一致,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

multisetset類似,但是允許出現重複的值。

實現如:

#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

multimapmap類似,但是允許鍵值重複。

實現如:

#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中,值就是關鍵字,集合中不會有多個相同的關...