C+±SET使用
HDU2000《set測試使用案例》
#include
#include
#include<string.h>
using namespace std;
int main(){
char s[3];
while(~scanf("%s",s)){
setse;
for(int i=0;i<strlen(s);i++){
se.insert(s[i]);
}
int flag=0;
set::iterator it;
for(it =se.begin();it!=se.end();it++){
if(!flag) cout<<*it,flag=1;
else cout<<" "<<*it;
}
cout<<endl;
}
return 0;
}
使用set前,需要在程序的頭文件中包含聲明#include ;它包含了set和multiset兩種容器額定義;
<1>創建set對象;
創建set對象時,需要指定元素的類型,這一點與其他容器一樣,下面的程序詳細說明了如何創建一個集合對象:
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象s,當前沒有任何元素;
//元素的排列採用默認的比較規則,當然,可以自定義比較規則函數;
set<int>s;
return 0;
}
<2>.set元素的插入;
採用insert()方法把元素插入到集合中去,插入的具體規則在默認的比較規則下,是按元素值從小到大插入,如果自己指定了比較規則函數,則按自定義比較規則函數插入。
使用前向迭代器對集合中序遍歷,其結果正好是元素排序的結果;
下例說明了insert()方法的使用方法:
運行結果爲:
1 6 8 12
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象a, 當前沒有任何元素;
set <int> s;
//插入了5個元素但由於8有重複,所以第二次插入的8並沒有執行;
s.insert(8); //第一次插入8,可以執行;
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8); //第二次插入8,重複元素,不會插入;
//中序遍歷集合中的元素
set <int> :: iterator it; //定義迭代器;
for(it=s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
<3>.set元素的反向遍歷;
使用反向迭代器reverse iterator可以反向遍歷集合,輸出的結果正好是集合元素的反向排序的結果,他需要用到rbegin()和rend()兩個方法,他們分別給出了反向遍歷的開始位置和借宿位置。
下例詳細的說明了如何對集合進行反向遍歷:
運行結果爲:
12 8 6 1
The Code Follows:
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象a, 當前沒有任何元素;
set <int> s;
//插入了5個元素但由於8有重複,所以第二次插入的8並沒有執行;
s.insert(8); //第一次插入8,可以執行;
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8); //第二次插入8,重複元素,不會插入;
//反向遍歷集合中的元素
set <int> :: reverse_iterator rit; //定義反向迭代器;
for(rit=s.rbegin(); rit != s.rend(); rit++) {
cout << *rit << " ";
}
cout << endl;
return 0;
}
<4>.set元素的刪除與容器清空;
與插入元素的處理一樣,集合就高效的刪除處理功能,並自動重新調整內部的紅黑樹的平衡;
刪除的對象可以是某個迭代器位置上的元素,等於某鍵值的元素,一個區間上的元素和清空集合;
運行結果爲:
12 8 1
0
The Code Follows:
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象a, 當前沒有任何元素;
set <int> s;
//插入了5個元素但由於8有重複,所以第二次插入的8並沒有執行;
s.insert(8); //第一次插入8,可以執行;
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8); //第二次插入8,重複元素,不會插入;
//刪除鍵值爲6的元素;
s.erase(6);
//反向遍歷集合洲哥的元素;
set <int> :: reverse_iterator rit; //定義反向迭代器;
for(rit=s.rbegin(); rit != s.rend(); rit++) {
cout << *rit << " ";
}
cout << endl;
// 清空集合 ;
s.clear();
cout << s.size() << endl;
return 0;
}
<5>. Set 元素的檢索;
使用find()方法對集合進行搜索,如果找到查找的鍵值,則返回該鍵值的迭代器位置,否則,返回集合最後一個元素後面的一個位置,即end();
下例程序詳細講述瞭如何使用find()方法對集合進行檢索:
運行結果爲:
6
Not find it!
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象a, 當前沒有任何元素;
set <int> s;
//插入了5個元素但由於8有重複,所以第二次插入的8並沒有執行;
s.insert(8); //第一次插入8,可以執行;
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8); //第二次插入8,重複元素,不會插入;
//查找鍵值爲6的元素;
set <int> ::iterator it; //定義前向迭代器;
it = s.find(6);
if(it != s.end()) cout << *it << endl;
//查找鍵值爲20的元素;
it = s.find(20);
if(it != s.end()) { // 找到
cout << *it << endl;
}else { //沒找到;
cout << "Not find it!" << endl;
}
return 0;
}
<6>.set自定義比較函數;
使用insert()方法將元素插入到集合中去的時候,集合會根據設定的比較函數將該元素放到蓋房的節點上去,在定義集合的時候,如果沒有指定比較函數,那麼採用默認的比較函數,即按鍵值由大到小的順序插入元素,在很多情況下,需要自己編寫比較函數;
編寫比較函數有兩種方法:
1>.如果元素不是結構體,那麼,可以編寫比較函數。下例程序編寫的比較規則是要求按鍵值由大到小的順序將元素插入到集合中;
運行結果:
12 8 6 1
The Code Follows:
#include
#include
using namespace std;
struct mycmp //自定義比較函數mycmp, 重載()運算符;
{
bool operator() (const int &a, const int &b)
{
return a > b;
}
};
int main(int argc, char *argv[])
{
//定義元素類型爲int的集合對象a, 當前沒有任何元素;
//採用的比較函數是mycmp;
set <int, mycmp> s;
//插入了5個元素但由於8有重複,所以第二次插入的8並沒有執行;
s.insert(8); //第一次插入8,可以執行;
s.insert(1);
s.insert(12);
s.insert(6);
s.insert(8); //第二次插入8,重複元素,不會插入;
set <int> ::iterator it; //定義前向迭代器;
for(it=s.begin(); it != s.end(); it++) {
cout << *it << " ";
}
cout << endl;
return 0;
}
2>. 如果元素是結構體,那麼,可以直接把比較函數寫在結構體內,下例程序詳細說明了具體操作:
運行結果爲:
Jack 80.5
Nacy 60.5
Tomi 20.5
#include
#include
#include
using namespace std;
struct Info
{
string name;
float score;
//重載 “ < ” 操作符,自定義排序準則;
bool operator < (const Info &a) const
{
// 按 score 由大到小排列。如果要由小到大排列 , 使用 “ > ” 號即可 ;
return a.score < score;
}
};
int main()
{
// 定義元素類型爲 Info 結構體的集合對象 s, 當前沒有任何元素 ;
set <Info> s;
// 定義 Info 結構體的對象 ;
Info info;
// 插入三個元素 ;
info.name = "Jack";
info.score = 80.5;
s.insert(info);
info.name = "Tomi";
info.score = 20.5;
s.insert(info);
info.name = "Nacy";
info.score = 60.5;
s.insert(info);
set <Info> :: iterator it; //定義前向迭代器;
for(it=s.begin(); it != s.end(); it++) {
cout << (*it).name << " " << (*it).score << endl;
}
return 0;
}