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 容器並沒有強制對儲存元素的型別做...