一、關於set
set是C++標準庫中的一種關聯容器。所謂關聯容器就是通過鍵(key)來讀取和修改元素。與map關聯容器不同,它只是單純鍵的集合。set容器的每一個鍵只能對應一個元素,即不存在鍵相同的不同元素。與map容器不同,set容器不支持下標操作訪問元素。
set是STL中一種標準關聯容器。它底層使用平衡的搜索樹——紅黑樹實現,插入刪除操作時僅僅需要指針操作節點即可完成,不涉及到內存移動和拷貝,所以效率比較高。set,顧名思義是“集合”的意思,在set中元素都是唯一的,而且默認情況下會對元素自動進行升序排列,支持集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作(求並、交、差、對稱差等操作,暫不細說,使用時要包含頭文件”algorithm”。 ),如果需要集合中的元素允許重複那麼可以使用multiset。
二、set中的常用成員函數
s.begin() –返回指向第一個元素的迭代器
s.clear() –清除所有元素
s.count(value) –返回某個值元素的個數
s.empty() –如果集合爲空,返回true
s.end() –返回指向最後一個元素的迭代器
s.equal_range(value )–返回集合中與給定值相等的上下限的兩個迭代器
s.erase(value) –刪除集合中的元素
s.find(value) –返回一個指向被查找到元素的迭代器
s.get_allocator() –返回集合的分配器
s.insert(value) –在集合中插入元素
s.erase() – 刪除一個元素
s.lower_bound(value) –返回指向大於(或等於)某值的第一個元素的迭代器
s.key_comp() –返回一個用於元素鍵值比較的函數
s.max_size() –返回集合能容納的元素的最大限值
s.rbegin() –返回指向集合中最後一個元素的反向迭代器
s.rend() –返回指向集合中第一個元素的反向迭代器
s.size() –集合中元素的數目
s.swap(int a,int b) –交換兩個集合變量
s.upper_bound(value) –返回大於某個值元素的迭代器
s.value_comp() –返回一個用於比較元素間的值的函數
三、代碼實現
#include<iostream>
#include<set>
using namespace std;
int main(){
//創建set容器集合
set<int>s;
multiset<int>ms;
int n,tmp;
scanf("%d",&n);
//插入數據元素
for(int i=0;i<n;i++){
scanf("%d",&tmp);
s.insert(tmp);
ms.insert(tmp);
}
//迭代輸出容器元素
set<int>::iterator it1;
multiset<int>::iterator it2;
cout<<"s: ";
for(it1=s.begin();it1!=s.end();it1++){
cout<<*it1<<" ";
}
cout<<endl;
cout<<"ms: ";
for(it2=ms.begin();it2!=ms.end();it2++){
cout<<*it2<<" ";
}
cout<<endl;
//查找
s.lower_bound(5);
s.upper_bound(5);
ms.lower_bound(5);
ms.upper_bound(5);
int cnt=s.count(5);
it1=s.find(5);
cout<<"cnt= "<<cnt<<endl;
cout<<"it1= "<< *it1 <<endl;
//刪除
s.erase(5);
ms.erase(5);
//輸出
cout<<"s: ";
for(it1=s.begin();it1!=s.end();it1++){
cout<<*it1<<" ";
}
cout<<endl;
cout<<"ms: ";
for(it2=ms.begin();it2!=ms.end();it2++){
cout<<*it2<<" ";
}
cout<<endl;
//清空
s.clear();
ms.clear();
return 0;
}
//結果:
//5
//11 5 5 6 2
//s: 2 5 6 11
//ms: 2 5 5 6 11
//cnt= 1
//it1= 5
//s: 2 6 11
//ms: 2 6 11
四、set中的特殊函數
1.count函數和find函數
s.count(value)–返回某個值元素的個數
s.find(value)–返回一個指向被查找到元素的迭代器
若使用count()和find()函數查詢同一元素5,count()函數返回的是該元素在set容器中的數量,find()函數則返回指向該元素的迭代器。需要注意的是,雖然使用find()函數可以返回指向該元素的迭代器,但只能對其做讀操作,任何試圖修改鍵值的操作都是非法的。
2.lower_bound函數和upper_bound函數
s.lower_bound(value)–返回指向大於(或等於)某值的第一個元素的迭代器
s.upper_bound(value)–返回大於某個值元素的迭代器
3..equal_range函數
s.equal_range(value )–返回集合中與給定值相等的上下限的兩個迭代器
返回一對定位器,分別表示第一個大於或等於給定關鍵值的元素和 第一個大於給定關鍵值的元素,這個返回值是一個pair類型,如果這一對定位器中哪個返回失敗,就會等於end()的值。