set作為stl中儲存資料的一種容器,底層使用紅黑樹作為內部結構。存入set中的資料具有單一不重複、自動公升序,因此可看做乙個公升序元素的集合。
基本操作如下
set <
int> s;
s.insert
(x)//向s中插入x元素
s.begin()
//返回s中第乙個元素的迭代器
s.end()
//返回s中最後乙個元素的迭代器
s.size()
//返回s中元素個數
s.empty()
//判斷s是否為空
s.find
(x)//返回x的迭代器
s.count
(x)//返回x出現次數
注意的是end()函式返回的實際是最後乙個元素旁邊的迭代器,但當直接使用時仍是最後乙個元素本身,例如
int a[5]
=;set <
int> s;
for(
int i=
0;i<
5;i++
) s.
insert
(a[i]);
set<
int>
::iterator it;
it=s.
end();
cout<<
*it<
輸出結果即是 5
但在find(x)函式中,若查詢的x元素不存在,迭代器將會返回到end(),此時若不加以判斷,則會返回s中的最後乙個元素造成錯誤,因此若使用find()函式可以加上語句
int x;
while
(cin>>x)
輸出結果如下
另一方面,若是想判斷元素是否在set中存在,也可使用count()函式。由於set容器的特點,每個元素x只會在set**現一次,因此count(x)的返回值只有0和1,即返回1則元素x存在,返回0則元素x不存在
貼一道例題
給定兩個整數集合,它們的相似度定義為:nc /nt ×100%。其中nc是兩個集合都有的不相等整數的個數,nt
是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。
輸入格式:
輸入第一行給出乙個正整數n(≤50),是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m(≤104 ),是集合中元素的個數;然後跟m個[0,109 ]區間內的整數。
之後一行給出乙個正整數k(≤2000),隨後k行,每行對應一對需要計算相似度的集合的編號(集合從1到n編號)。數字間以空格分隔。
輸出格式:
對每一對需要計算的集合,在一行中輸出它們的相似度,為保留小數點後2位的百分比數字。
輸入樣例:
3輸出樣例:3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
21 2
1 3
50.00%解題思路:題意即是判斷給定兩集合交集和並集的比值,用set就可以很方便的解決,開乙個set型陣列分別記錄集合,遍歷查詢即可。確實是因為這道題學習了set的用法。33.33%
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
int n;
set <
int> s[
100]
;voidf(
int a,
int b)
}int sum = s[a]
.size()
+ s[b]
.size()
;double t=
(double
)x/(sum-x)
*100
;printf
("%.2lf%%\n"
,t);
}int
main()
} cin>>m;
while
(m--
)return0;
}
拙見至此 歡迎指 C set用法總結
c 中set的用法 set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值 value 和鍵值 key set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。簡單來說,set集合是c stl庫中自帶的乙個容器,set具有以下兩個特點 1 s...
C set用法詳解
c stl之所以得到廣泛的讚譽,也被很多人使用,不只是提供了像vector,string list等方面的容器,更重要的是stl封裝了許多複雜的資料結構和大量實用的資料結構操作。vector封裝了陣列,list封裝了鍊錶,map和set封裝了二叉樹等,在封裝這些資料結構的時候,stl按照程式設計師的...
C Set常用用法
set集合容器 實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值 另外,還得保證根節點左子樹的高度與右子樹高度相等。平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector...