set是stl中一種標準關聯容器(vector,list,string,deque都是序列容器,而set,multiset,map,multimap是標準關聯容器),它底層使用平衡的搜尋樹——紅黑樹實現,插入刪除操作時僅僅需要指標操作節點即可完成,不涉及到記憶體移動和拷貝,所以效率比較高。set,顧名思義是「集合」的意思,在set中元素都是唯一的,而且預設情況下會對元素自動進行公升序排列,支援集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允許重複那麼可以使用multiset
#include
#include
#include
using namespace std;
int main()
set會對元素進行排序,那麼問題也就出現了排序的規則是怎樣的呢?上面的示例**我們發現對int型的元素可以自動判斷大小順序,但是對char*就不會自動用strcmp進行判斷了,更別說是使用者自定義的型別了,事實上set的標準形式是set, 引數
描述預設值
key集合的關鍵字和值的型別
compare
關鍵字比較函式,它的引數型別key引數指定的型別,如果第乙個引數小於第二個引數則返回true,否則返回false
less
alloc
set的分配器,用於內部記憶體管理
alloc
下面給出乙個關鍵字型別為char*的示例**
#include
#include
#include
using namespace std;
struct ltstr};
int main()
;const char* b[n] = ;
seta(a, a + n);
setb(b, b + n);
setc;
cout << "set a: ";
//copy(a.begin(), a.end(), ostream_iterator(cout, " "));
set::iterator itr;
for(itr=a.begin();itr!=a.end();itr++) cout<<*itr<<" ";
cout << endl;
cout << "set b: ";
copy(b.begin(), b.end(), ostream_iterator(cout, " "));
cout << endl;
cout << "union: ";
set_union(a.begin(), a.end(), b.begin(), b.end(),
ostream_iterator(cout, " "),
ltstr());
cout << endl;
cout << "intersection: ";
set_intersection(a.begin(), a.end(), b.begin(),b.end(),ostream_iterator(cout," "),ltstr());
cout<
set_difference(a.begin(), a.end(), b.begin(), b.end(),inserter(c, c.begin()),ltstr());
cout << "set c (difference of a and b): ";
copy(c.begin(), c.end(), ostream_iterator(cout, " "));
cout <
return 0;}
其中的ltstr也可以這樣定義
class ltstr};
更加通用的應用方式那就是資料型別也是由使用者自定義的類來替代,比較的函式自定義,甚至可以加上二級比較,比如首先按照總分數排序,對於分數相同的按照id排序,下面是示例**
#include
#include
using namespace std;
struct
;struct compare};
int main()
STL 中set的用法
set set2 set1 建立set1的副本set2,set2與set1必須有相同的鍵型別和值型別 set set3 b,e 建立set型別的物件set3,儲存迭代器b和e標記的範圍內所有元素的副本。元素的型別必須能轉換為k型別 lower bound 返回指向大於或等於某值的第乙個元素的迭代器 ...
c 中set用法詳解
1.關於set c stl 之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string,list等方便的容器,更重要的是stl封裝了許多複雜的資料結構演算法和大量常用資料結構操作。vector封裝陣列,list封裝了鍊錶,map和set封裝了二叉樹等,在封裝這些資料結構的時候,s...
C 中set用法詳解
include include using namespace std intmain set int iterator it for it s.begin it s.end it 沒有值 cout s.begain s.begin cout lower buond 3 s.lower bound ...