set是我們所說的單重集合。set是一類資料的集合,乙個有序集合,也就是說它裡邊的元素都是排好序的,並且set不允許插入的元素重複。set支援插入刪除查詢等操作,它的所有操作都能在(logn)的時間複雜度內完成,效率很高。multiset與set的區別就在於,multiset允許插入的元素重複。
set的預設排序準則是less,當然我們也可以去定義其他的排序準則。
1.template引數定義之:
std::set> coll;
這種情況下,排序準則是是型別的一部分,這是排序準則的通常指定用法,如果排序準則不相同,則不能相互比較。
2.以構造函式引數定義之:
這種情況下,同乙個型別可以運用不同的排序準則,而排序準則的初始值或狀態可以不同。如果執行期間才獲得排序準則,而且需要用到不同的排序準則,以構造函式引數定義的方式則派上用場了。
count(elem): 返回「元素值為elem」的元素個數
find(elem):返回「元素值為elem」的第乙個元素,如果找不到就返回end()
lower_bound(elem):返回elem的第乙個可安插位置,也就是「元素值》=elem」的第乙個位置
upper_bound(elem)):返回elem的最後乙個可安插位置,也就是「元素值》elem」的第乙個位置
equal_range(elem):返回elem可安插的第乙個位置和最後乙個位置,即equal_range()將lower_bound()和upper_bound()的 返回值做個乙個pair返回。
**:
int main()
myset.insert(-1);
myset.insert(8);//插入失敗,不允許鍵值重複
auto tmp = myset.find(9);
auto it = myset.erase(0);//刪除0號下標的元素,返回值是下乙個元素的迭代器
myset.erase(8);
刪除該區間的所有元素,返回以乙個元素的迭代器
myset.swap(ss);//交換兩個集合容器
multisetmymuset;//多重集合
for(int i = 0;i < 10;++i)
mymuset.insert(9);//允許鍵值重複
mymuset.erase(7);
mymuset.erase(mymuset.begin(),mymuset.end());//刪除區間內的所有資料
二、map和multimap
map是單對映,multimap是多對映。它們是我們的對映容器,的對映。map的所有元素都是pair(組),同時擁有實值和鍵值,pair的第一元素被視為是鍵值,第二元素被視為是實值;map不允許兩個元素有相同的鍵值。我們也不能通過map的迭代器改變map的鍵值,因為map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。但是可以修改元素的實值。
map和list擁有相同的某些性質,當對它的容器元素進行增刪操作時,操作之前的所有迭代器,在操作完成之後依然有效,當然被刪除的那個元素的迭代器必然是個例外。
multimap和map的操作類似,唯一區別multimap鍵值可重複。
它們底層都是以紅黑樹實現的。
(摘抄於:
C 學習筆記 STL常用容器 set和map
set 所有元素在插入時自動排序,底層結構用二叉樹實現。set和multiset的區別 set不允許容器中有重複的元素,multiset允許容器中有重複的元素。set構造和賦值 構造 預設建構函式 setst 拷貝建構函式 set const set st 賦值 過載等號操作符 set operat...
set容器 map容器
簡介 本質 set和multiset區別 構造 賦值 include void printset set int s cout endl 構造和賦值 void test01 intmain 總結 函式原型 include void printset set int s cout endl 大小 vo...
STL之map容器和multimap容器
所有元素都會根據元素的鍵值自動排序。map所有的元素都是pair,同時擁有實值和鍵值,pair的第一元素被視為鍵值,第二元素被視為實值,map不允許兩個元素有相同的鍵值。map的鍵值關係到map元素的排列規則,任意改變map鍵值將會嚴重破壞map組織。如果想要修改元素的實值,那麼是可以的。map和l...