c++官方對set的定義如下:
set:sets are containers thatstore unique elementsfollowing a specific order.類模板如下:set:set是一類用來儲存滿足一定排序的獨一元素的容器。
template < class t, // set::key_type/value_type
class compare = less, // set::key_compare/value_compare
class alloc = allocator// set::allocator_type
> class set;
可以看到set模板類有三個引數:
t:set容器中的元素型別。
compare:比較類,定義容器中元素排序,預設為less< t >。
alloc:記憶體分配器。一般使用預設值。
set<
int, less<
int>
> set_less;
set<
int, greater<
int>
> set_greater;
for(
int i=
0; i<
10; i++
)// 遍歷
for(set<
int, less<
int>
>
::iterator iter=set_less.
begin()
; iter!=set_less.
end(
); iter++
) cout
int, greater<
int>
>
::iterator iter=set_greater.
begin()
; iter!=set_greater.
end(
); iter++
)
輸出為:
012
210
1.預設pair排序setint,
int>
> set_pair;
for(
int i=
0; i<
10; i++
)for
(setint,
int>
>
::iterator iter=set_pair.
begin()
; iter!=set_pair.
end(
); iter++
)cout<
(0,
0)(1
,1)(
2,2)
(3,0
)(4,
1)(5
,2)(
6,0)
(7,1
)(8,
2)(9
,0)
2.使用less、greater排序
使用less:
setint,
int>
, lessint,
int>>
> set_pair_less;
for(
int i=
0; i<
10; i++
)for
(setint,
int>
, lessint,
int>>
>
::iterator iter=set_pair_less.
begin()
; iter!=set_pair_less.
end(
); iter++
)cout<
(0,
0)(1
,1)(
2,2)
(3,0
)(4,
1)(5
,2)(
6,0)
(7,1
)(8,
2)(9
,0)
使用greater:
setint,
int>
, greaterint,
int>>
> set_pair_greater;
for(
int i=
0; i<
10; i++
)for
(setint,
int>
, greaterint,
int>>
>
::iterator iter=set_pair_greater.
begin()
; iter!=set_pair_greater.
end(
); iter++
)cout<
(9,
0)(8
,2)(
7,1)
(6,0
)(5,
2)(4
,1)(
3,0)
(2,2
)(1,
1)(0
,0)
使用less<>、greater<>模板對pair< int , int >排序時,先比較pair的第乙個元素,如果第乙個元素相等再比較第二個元素。
3.使用仿函式自定義排序
例如,我們使用pair記錄字串中字元的順序時(實際上使用map容器記錄會更方便),希望set中的字元按照頻率公升序排列(頻率相同時,順序不做要求),正確的**如下:
class
cmp}
;int
main()
setchar
,int
>
, cmp> set_pair;
for(
int i=
0; i<
26; i++
)else
} setchar
,int
>
, cmp>
::iterator iter = set_pair.
begin()
;for
(; iter!=set_pair.
end(
); iter++
)return0;
}
輸出為:
(c,1)
(e,1
)(g,1)
(i,1
)(l,1)
(n,1
)(t,1)
(s,2
)(a,
3)
需要注意的是,儘管排序時我們只需要考慮pair< char, int>中的第二個引數,頻率(int);不需要考慮第乙個引數,字元(char)。但是在仿函式cmp的()運算子過載中,也必須進行字元比較。
如果寫成如下(下面的**是錯誤的):
class
cmp}
;// 其他部分**都相同..
.
最終的輸出為:
(c,1)
(s,2
)(a,
3)
這是因為:前面已經提到set中只會store unique elements,即對於"相等"的元素set中只儲存乙個。而set中用cmp類來判斷兩個元素是否equal。假如兩個元素a和b,cmp(a,b)返回false,cmp(b,a)也返回false,那麼就認為a和b相等。假如a和b的second(在本例中代表字元的頻率)相等,那麼set會只儲存最後插入的元素,之久導致最終set中只會儲存second(字元的頻率)不同的元素。 stl set使用模板
明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 100 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成 去重 與 排序 ...
STL set的介紹與使用
c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等,在封裝這些資料結構的時候,stl按照程式設計...
STL set 使用方法小結
set是stl中一種標準關聯容器 vector,list,string,deque都是序列容器,而 set,multiset,map,multimap是標準關聯容器 它底層使用平衡的搜尋樹 紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可 完成,不涉及到記憶體移動和拷貝,所以效率比較高。set,顧...