C STL學習之八 關聯式容器set深入學習

2021-06-22 14:35:58 字數 1874 閱讀 1717

set和map的最大不同就是set是單值,而map是鍵值對, 當然set也可以理解成鍵值對相等的特殊鍵值對。multiset和set有什麼區別呢?主要值能不能重複的問題,如果可以儲存多個相同值的話就使用multiset否則就使用set。因為插入的時候,它們分別呼叫的是insert和unique_insert;同理,map和multimap也是這個意思。

和所有關聯式容器類似,通常使用平衡二叉樹完成。事實上,set和multiset通常以紅黑樹實作而成。

自動排序的優點是使得搜尋元素時具有良好的效能,具有對數時間複雜度。但是造成的乙個缺點就是:

不能直接改變元素值。因為這樣會打亂原有的順序。

改變元素值的方法是:先刪除舊元素,再插入新元素。

訪問元素只能通過迭代器,從迭代器的角度看,元素值是常數。

程式例項

#include#include#includeusing namespace std;

int main(int argc,char *argv)

if(s1==s2)//要比較s1和s2,就必須保證它們按相同的順序排序

cout<<"c1==c2"<(cout," "));

cout<>::iterator,bool> status=s1.insert(4);

if(status.second)

cout<<"4 is inserted as element"<(cout," "));

coutcopy(s3.begin(),s3.end(),ostream_iterator(cout," "));

cout<

有兩種方式可以定義排序準則:

1、以template引數定義:

[cpp]view plain

copy

print?

set<

int,greater<

int>> col1;  

此時,排序準則就是型別的一部分。型別系統確保只有排序準則相同的容器才能被合併。

2、以構造函式引數定義。

這種情況下,同乙個型別可以運用不同的排序準則,而排序準則的初始值或狀態也可以不同。如果執行期才獲得排序準則,而且需要用到不同的排序準則,這種方式可以派上用場。

賦值操作兩端的容器必須具有相同的型別,但是比較準則本身可以不同,但是其型別必須相同。如果比較準則的不同,準則本身也會被賦值或交換。

set提供的插入函式:

[cpp]view plain

copy

print?

pairbool

> insert(

const

value_type& elem);   

iterator  insert(iterator pos_hint, const

value_type& elem);   

multiset提供的插入函式:

[cpp]view plain

copy

print?

iterator  insert(

const

value_type& elem);   

iterator  insert(iterator pos_hint, const

value_type& elem);  

返回值型別不同的原因是set不允許元素重複,而multiset允許。當插入的元素在set中已經包含有同樣值的元素時,插入就會失敗。所以set的返回值型別是由pair組織起來的兩個值:

第乙個元素返回新元素的位置,或返回現存的同值元素的位置。第二個元素表示插入是否成功。

set的第二個insert函式,如果插入失敗,就只返回重複元素的位置!

C STL中的關聯式容器

stl中的容器,比如 vector list deque forward list c 11 等,這些容器統稱為序列式容器,因為其底層為線性序列的資料結構,裡面儲存的是元素本身。關聯式容器也是用來儲存資料的,與序列式容器不同的是,其裡面儲存的是結構的鍵值對,在資料檢索時比序列式容器效率更高。樹形結構...

C STL容器學習總結之八 對映map

c stl容器學習總結之一 向量vector c stl容器學習總結之二 鍊錶list c stl容器學習總結之三 雙端佇列deque c stl容器學習總結之四 佇列queue c stl容器學習總結之五 優先佇列priority queue c stl容器學習總結之六 棧stack c stl容...

C STL 26 關聯式容器set用法

set容器都會自行根據鍵的大小對儲存的鍵值對進行排序,只不過 set 容器中各鍵值對的鍵 key 和值 value 是相等的,根據 key 排序,也就等價為根據 value 排序。另外,使用 set 容器儲存的各個元素的值必須各不相同。更重要的是,從語法上講 set 容器並沒有強制對儲存元素的型別做...