set是STL中一种标准关联容器。它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列,支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。
下面介绍set的常用操作:
1:注意包含头文件<set>
set只有自加和自减运算!!!
s.begin() 返回set容器的第一个元素的地址
s.end() 返回set容器的最后一个元素之后的地址
s.clear() 删除set容器中的所有的元素
s.empty() 判断set容器是否为空
s.insert() 插入一个元素
s.erase() 删除一个元素
s.size() 返回当前set容器中的元素个数
具体看代码:
#include<iostream> #include<set> using namespace std; int main() { set<int> s;//创建一个set对象 for(int i=0;i<3;i++) s.insert(i+10);//插入三个元素,10 11 12 cout<<*s.begin()<<endl;//输出第一个元素10 cout<<*(--s.end())<<endl;//输出最后一个元素 s.erase(s.begin());//删除第一个元素 cout<<*s.begin()<<endl;//第一个元素变为11 cout<<s.size()<<endl;//答案为2 s.clear();//清空所有元素 cout<<s.size()<<endl;//输出为0 return 0; }
迭代器的使用:
#include<iostream> #include<set> using namespace std; int main() { set<int> s;//创建一个set对象 for(int i=0;i<3;i++) s.insert(i+10);//插入三个元素,10 11 12 set<int>::iterator it;//创建一个迭代器 for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历 cout<<*it<<" "; cout<<endl; it=s.begin(); it++; s.erase(it);//用迭代器进行删除操作 for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历 cout<<*it<<" "; cout<<endl; return 0; }
修改:不能修改容器内数据,所以只能删除某元素再插入要修改的数值
查找:s.find()
如果容器内不存在该元素,返回值等于s.end();
#include<iostream> #include<set> using namespace std; int main() { set<int> s;//创建一个set对象 for(int i=0;i<3;i++) s.insert(i+10);//插入三个元素,10 11 12 set<int>::iterator it;//创建一个迭代器 for(it=s.begin();it!=s.end();it++)//用迭代器进行遍历 cout<<*it<<" "; cout<<endl; if(s.find(10)!=s.end()) cout<<"yes"<<endl; return 0; }
set的其它常用操作:
s.lower_bound() 返回第一个大于或等于给定关键值的元素
s.upper_bound() 返回第一个大于给定关键值的元素
s.equal_range() 返回一对定位器,分别表示 第一个大于或等于给定关键值的元素 和 第一个大于给定关键值
的元素,这个返回值是一个pair类型,如果这一对定位器中哪个返回失败,就会等于
s.end()
#include<iostream> #include<set> using namespace std; int main() { set<int> s;//创建一个set对象 for(int i=0;i<3;i++) s.insert(i+10);//插入三个元素,10 11 12 cout<<*s.lower_bound(10)<<endl;//输出10 cout<<*s.upper_bound(10)<<endl;//输出11 cout<<*s.equal_range(10).first<<endl;//10 cout<<*s.equal_range(10).second<<endl;//11 return 0; }
如果要把set定义为降序:可以如下定义:
#include<iostream> #include<set> using namespace std; int main() { set<int,greater<int> >s; for(int i=0;i<3;i++) s.insert(i+10); set<int>::iterator it; //降序输出 for(it=s.begin();it!=s.end();it++) cout<<*it<<endl; return 0; }