C STL中set和multiset的使用方法

2021-06-23 01:57:00 字數 3770 閱讀 2017

構造

set集合主要目的是為了快速檢索,不可直接去修改鍵值。

需要引用標頭檔案:

#include

template

classcompare=less,

classalloc=stl_default_allocator(key) >

比較函式物件及記憶體分配器採用的是預設引數,因此如果未指定,它們將採用系統預設方式。 若

key的型別

t為類或

struct

時,需要提供t的

==和<

的過載運算子。

struct ipless };

class ip

booloperator==(const ip& a, const ip& b) const }

建立set物件,有幾種常用方式:

//建立空的set物件,元素型別為int

set setint;

//建立空的set物件,元素型別char*,比較函式物件(即排序準則)為自定義strless

set setip;

//利用set物件s1,拷貝生成set物件s2

setsetint2(setint);

//用迭代區間[&first,&last)所指的元素,建立乙個set物件

int iarray = ;

set setint3(iarray,iarray + 3);

//用迭代區間[&first,&last)所指的元素,及比較函式物件strless,建立乙個set物件

ip szarray = ;

set setip(szarray, szarray + 3);

使用insert

函式插入資料,

insert

可返回pair

,如果集合已有該資料,則失敗並置返回值中

bool

為false

;否則,

bool

為true

,iterator

指向剛插入資料的位置。

insert

還可以一次插入

[first, last

)區間的多個資料,其中,

first,last

均為迭代器。

set setip;

setip.insert(ip(1,1,1,1));

setip.insert(ip(2,2,2,2));

setip.insert(ip(3,3,3,3));

setip.insert(ip(4,4,4,4));

pair

::iterator, bool> insert_res;

insert_res = setip.insert(ip(4,4,4,4));

if(!insert_res.second);

setip.insert(iparr,iparr+3);

正向遍歷(以

key的公升序遍歷,對應樹的中序遍歷)

for(set

::iterator itr = setip.begin(); itr !=setip.end(); itr++)

cout<< "setip2:"

<< endl;

for(set

::iterator itr=setip2.begin();itr!=setip2.end();itr++)

ip* endarr =set_intersection(setip.begin(), setip.end(), setip2.begin(), setip2.end(),arr);

int sizearr = endarr -arr;

cout<< "set_intersection(setip,setip2):"

<< endl;

for(int i = 0; i cout<"."

<"."

<"."

<}

endarr= set_union(setip.begin(), setip.end(), setip2.begin(), setip2.end(), arr);

sizearr= endarr - arr;

cout<< "set_union(setip,setip2):"

<< endl;

for(int i = 0; i cout<"."

<"."

<"."

<}

endarr=set_difference(setip.begin(),setip.end(),setip2.begin(), setip2.end(), arr);

sizearr= endarr - arr;

cout<< "set_difference(setip,setip2):"

<< endl;

for(int i = 0; i < sizearr;i ++)

endarr= set_symmetric_difference(setip.begin(), setip.end(), setip2.begin(),setip2.end(), arr);

sizearr= endarr - arr;

cout<< "set_symmetric_difference(setip,setip2):"

<< endl;

for(int i = 0; i cout<"."

<"."

<"."

《輸出結果為:

setip:

1.1.1.1

2.2.2.2

3.3.3.3

4.4.4.4

setip2:

1.1.1.1

2.2.2.2

91.91.91.91

92.92.92.92

set_intersection(setip,setip2):

1.1.1.1

2.2.2.2

set_union(setip,setip2):

1.1.1.1

2.2.2.2

3.3.3.3

4.4.4.4

91.91.91.91

92.92.92.92

set_difference(setip,setip2):

3.3.3.3

4.4.4.4

set_symmetric_difference(setip,setip2):

3.3.3.3

4.4.4.4

91.91.91.91

92.92.92.92

如果需要通過函式物件來提供ip的《運算子,如函式物件的類為ipcomp,則需要在各函式最末尾增加乙個引數,傳遞ipcomp的物件。如集合交函式應為

set_intersection(setip.begin(),setip.end(), setip2.begin(), setip2.end(),

arr,ipcomp());

multiset和set的方法使用基本相同,只有少數區別:

multiset的允許乙個集合中,出現多個相同的元素,而set中的元素具有唯一性,相同是在操作符==比較的意義上。

set:有元素匹配,返回1;否則,返回0。

multiset:返回multiset 中其鍵與指定為引數的鍵匹配的元素數量。

set:刪除集合中的唯一的值為element的元素;

multiset:刪除集合中的所有值為element的元素。

都只是刪除iteratora指向的單個元素

set:返回唯一匹配元素的位置

multiset:返回第乙個匹配元素的位置

STL學習筆記7 容器set和multiset

在標頭檔案中定義 namespace std set和multiset都是關聯容器,是有序的集合,集合中包含不可重複的 型別為key的元素。排序通過使用型別為compare的比較函式比較來實現。搜尋,刪除和插入操作具有對數時間複雜度。set和multiset通常都以紅黑樹實現。multiset相對s...

C STL中的容器 Set

set跟vector差不多,它跟vector的唯一區別就是,set裡面的元素是有序的且唯一的,只要你往set裡新增元素,它就會自動排序,而且,如果你新增的元素set裡面本來就存在,那麼這次新增操作就不執行。要想用set先加個頭檔案set。其中數值型按照從小到大排列 字元型按照字典序排列 includ...

C STL中set底層實現方式

q stl中set底層實現方式?為什麼不用hash?a 第乙個問題 set底層實現方式為rb樹 即紅黑樹 第二個問題 首先set,不像map那樣是key value對,它的key與value是相同的。關於set有兩種說法,第乙個是stl中的set,用的是紅黑樹 第二個是hash set,底層用得是h...