set的特性是,所有的元素都會根據元素的鍵值自動排序。set的元素不像map那樣可以同時擁有實值(value)和鍵值(key),set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素擁有相同的鍵值。
不能通過set的迭代器改變set的元素值,因為set元素的值就是其鍵值,關係到set元素的排列規則。如果任意改變set元素值,會嚴重破壞set組織。
set擁有list相同的某些性質:當客戶端對她進行元素新增操作或刪除操作的時候,操作之前的所有迭代器,在操作完成之後都依然有效。當然,被刪除的那個元素的迭代器必然是個例外。
標準的stl set 以紅黑樹作為底層的實現機制。
set的部分原始碼如下:
template , typename alloc = alloc>
//compare預設的情況使用遞增排序
class set
templateset(inputiterator first, inputiterator last):t(compare())
templateset(inputiterator first, inputiterator last, const compare& comp):t(comp)
set(const set& x):t(x.t){}
//賦值運算子
set& operator=(const set& x)
//下面的操作,紅黑樹已經提供,set只要呼叫即可
iterator begin() const //公升序排序時指向最xiao節點
iterator end() const //注意這個指向的是樹的header,頭結點的父節點(小技巧)
reverse_iterator rbegin() const //公升序排序時指向最da節點
reverse_iterator rend() const
bool empty() const
size_type size() const
typedef pairpair_iterator_bool;
pairinsert(const value_type& x)
template void insert(inputiterator first, inputiterator last)
void erase(iterator position)
void erase(iterator first, iterator last)
}}
set所提供的函式簡介:
這個函式底部呼叫的是insert_unique,返回的是乙個pair,pair的第乙個元素是插入的節點的迭代器,第二個元素是是否插入成功。
begin和end是正向迭代器,其他的兩個是反向迭代器。假設紅黑樹是遞增的(左子樹的節點key < 根節點key < 右子樹的節點key),這是begin()返回最小元素的迭代器而rbegin()返回最大元素的迭代器。end()和rend()都是header節點的迭代器。(header是stl實現紅黑樹時的小技巧,header的父親指標指向root,header的左指標指向以root為根節點的最小元素,header的右指標指向以root為根節點的最大元素,root的父節點指向header)
這個函式的引數盛放是插入元素的容器的迭代器的開始位置和結束位置,注意返回值是void
函式引數是要刪除的元素的迭代器
函式第乙個引數是要刪除的元素段的最小元素的迭代器,第二個引數是要刪除元素段的最大元素的迭代器
函式引數是刪除元素的值
返回x的迭代器
返回節點key值為x的節點個數
multiset的特性及用法和set完全相同,唯一的差別在於multiset允許鍵值重複,因此它的插入操作採用的紅黑樹的insert_equal()而不是insert_unique()。注意insert_unique的返回值是pair前面已經介紹了,insert_equal的返回值是插入節點的iterator,注意使用下面函式和set返回值的區別:
//返回值和set不一樣
iterator insert(const value_type& x)
STL學習筆記7 容器set和multiset
在標頭檔案中定義 namespace std set和multiset都是關聯容器,是有序的集合,集合中包含不可重複的 型別為key的元素。排序通過使用型別為compare的比較函式比較來實現。搜尋,刪除和插入操作具有對數時間複雜度。set和multiset通常都以紅黑樹實現。multiset相對s...
C 關聯式容器(set)詳解
關聯容器與序列容器有著根本性的不同,序列容器的元素是按照在容器中的位置來順序儲存和訪問的,而關聯容器的元素是按關鍵元素來儲存和訪問的。關聯容器支援高效的關鍵字查詢與訪問。兩個主要的關聯容器型別是map與set。概念 set裡面每個元素只存有乙個key,它支援高效的關鍵字查詢操作。set對應數學中的 ...
關聯容器 set
set容器用來儲存同一資料型別的資料,並且能從乙個資料集合中取出資料,在set中每個元素的值都唯一,而且系統能根據元素的值自動進行排序,set元素的值不能直接被改變。set容器內部採用一種非常高效平衡檢索二叉樹 紅黑樹 mset.begin 返回set容器的第乙個元素的迭代器 mset.end 返回...