一、关于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()的值。