STL set儲存pair並使用仿函式自定義排序

2021-10-11 00:20:30 字數 4017 閱讀 5702

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,顧...