構造
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...