stl容器很多,每乙個容器就是乙個類模板
①順序容器
②介面卡容器
③關聯容器
可參考演算法設計與分析——常用的stl容器(一)
演算法設計與分析——常用的stl容器(三)
關聯容器中的每個元素有乙個key(關鍵字),通過key來儲存和讀取元素,這些關鍵字可能與元素在容器中的位置無關,所以關聯容器不提供順序容器中的 front(), push_front()、back()、push_back()以及pop_back()操作。
(1)set(集合容器)/ multiset(多重集合容器)
①set和 multiset都是集合類模板,其元素值稱為關鍵字。set中元素的關鍵字是唯一的, multiset中元素的關鍵字可以不唯一,而且預設情況下會對元素按關鍵字自動進行公升序排列,所以查詢速度比較快,同時支援交差和並等一些集合上的運算,如果需要集合中的元素允許重複,那麼可以使用 multiset
②由於set中沒有相同關鍵字的元素,在向set中插入元素時,如果已經存在則不插入。 multiset中允許存在兩個相同關鍵字的元素,在刪除操作時刪除 multiset中值等於elem的所有元素,若刪除成功返回刪除個數,否則返回0
③set/multiset的成員函式如下:
empty()
:判斷容器是否為空。
size()
:返回容器中的實際元素個數
insert()
:插入元素。
erase()
:從容器中刪除乙個或幾個元素。
clear()
:刪除所有元素。
count
(k):返回容器中關鍵字k出現的次數。
find
(k):如果容器中存在關鍵字為k的元素,返回該元素的迭代器,否則返回end
()值。
upper_bound()
:返回乙個迭代器,指向關鍵字大於k的第乙個元素。
lower_bound()
:返回乙個迭代器,指向關鍵字不小於k的第乙個元素。
begin()
:用於正向迭代,返回容器中第乙個元素的位置。
end(
):用於正向迭代,返回容器中最後乙個元素後面的乙個位置。
rbegin()
:用於反向迭代,返回容器中最後乙個元素的位置。
rend()
:用於反向迭代,返回容器中第乙個元素前面的乙個位置。
例如有以下程式:
#include
using
namespace std;
void
main()
printf
("\n");
multiset<
int>ms;
multiset<
int>
::iterator mit;
ms.insert(1
);ms.
insert(3
);ms.
insert(2
);ms.
insert(4
);ms.
insert(2
);printf
("ms: ");
for(it=ms.
begin()
;mit!=ms.
end(
);mit++
)printf
("\n");
}
執行結果:
s:12
34ms:122
34
(2)map(對映容器)/multimap(多重對映容器)
①map和 multimap都是對映類模板。對映是實現關鍵字與值關係的儲存結構,可以使用乙個關鍵字key來訪問相應的資料值 value。set/multiset中的key和 value都是key型別,而map/multimap中的key和 value是乙個pair類結構,pair類結構的宣告形式如下:
struct pair
也就是說,pair中由兩個分量(二元組),first為第乙個分量,在map中對應key,second對應value。
例如定義乙個物件p1標識乙個平面座標點,並輸入座標:
pair<
double
,double
>p1;
cin>>p1.first>>p1.second;
同時pair對==,!=,<>,<=,>=共6個運算子進行過載,提供了按照字典序對元素進行大小比較的比較運算子模板函式。
map/multimap利用pair的<運算子將所有元素(即key -value對)按key的公升序排列,以紅黑樹的形式儲存,可以根據key快速地找到與之對應的 value(查詢時間為o(log2n))
map中不允許關鍵字重複出現,支援[]運算子;而multimap中允許關鍵字重複出現,但不
支援[運算子。
②map/multimap的主要成員函式如下:
empty()
:判斷容器是否為空。
size()
:返回容器中的實際元素個數。
map[key]
:返回關鍵字為key的元素的引用,如果不存在這樣的關鍵字,則以key作為關鍵字插入乙個元素(不適合 multimap)
insert
(elem)
:插入乙個元素elem並返回該元素的位置。
clear()
:刪除所有元素。
find()
:在容器中查詢元素。
count()
:容器中指定關鍵字的元素個數(map中只有1或者0)
begin()
:用於正向迭代,返回容器中第乙個元素的位置。
end(
):用於正向迭代,返回容器中最後乙個元素後面的乙個位置。
rbegin()
:用於反向迭代,返回容器中最後乙個元素的位置。
rend()
:用於反向迭代,返回容器中第乙個元素前面的乙個位置。
③以map為例進行說明。在map中修改元素非常簡單,這是因為map容器已經對[]運算子進行了過載。例如:
map<
char
,int
>mymap;
mymap[
'a']=1
;
獲得map中乙個值的最簡單方法如下:
int ans=mymap[
'a']
;
只有當map中有這個關鍵字(『a』)時才會成功,否則自動插入乙個元素,其關鍵字為』a』,對應的值為int型別預設值0.使用者可以用find()方法來發現乙個關鍵字是否存在,傳入的引數是要查詢的key。
④例如有以下程式:
#include
#include
using
namespace std;
intmain()
執行結果:
[a,1]
[b,2
][c,
3]
STL常用容器與演算法
stl共有六大元件 1 容器。2 演算法。3 迭代器。4 仿函式。6 介面卡。stl容器的實現原理 stl來管理資料十分方便,省去了我們自己構建資料結構的時間.其實,stl的實現也是基於我們常見的資料結構.序列式容器 vector 陣列,元素不夠時再重新分配記憶體,拷貝原來陣列的元素到新分配的陣列中...
STL容器演算法迭代器的設計理念
1 stl的容器通過類模板技術,實現資料型別和容器模型的分離。2 stl的迭代器技術實現了遍歷容器的統一方法 也為stl的演算法提供了統一性,把容器和演算法有效的粘合在一起 3 stl的函式物件實現了自定義資料型別的演算法運算。演算法和函式物件 4 演算法通過函式物件 謂詞 實現自定義資料型別和基礎...
STL 容器的常用操作
基礎資料結構 deque 佇列 雙向表 list 雙向鍊錶 vector 單向鍊錶 include include include include include include include include includeusing namespace std int main01 a.pop ...