在set关联式容器中,元素是按关键字有序存储的,容器遍历就以此顺序进行。因此,关联式容器不支持push_front和push_back之类的操作,这些操作与它的排序规则相冲突,它不会按这样的方式存取数据,没有支持这些操作的必要。
集合类multiset和set提供了数字(包括字符及串)集合的操作,集合中的数字称为关键字,不需要有另一个值与关键字相关联。set和multiset会根据特定的排序准则,自动将元素排序,亮着提供的操作方法基本相同,只是multiset允许元素重复而set不允许重复。如果向set集合中插入相同的元素,set会忽略它;向multiset集合插入相同元素时,则不会有问题。
(1)set和multiset的定义
set c //建立一个空的set/multiset集合
set c(op) //以op为排序准则建立一个空集
set c1(c2) //建立一个集合c1,并用c2集合初始化
set c(beg,end) //用区间[beg,end]建立一个集合c
上述形式的set可以是:
set/multiset<T> //建立T类型,以less<>(从小到大)的排序集合
set/multiset<T,op> //建立T类型,以op指定排序规则的集合
其中,op可以是less<>或greater<>之一,应用时须在< >中写上类型,如greater<int>。less指定的排序方式为从小到大,greater指定排序方式为从大到小,默认排序方式为less。
(2)set和multiset的赋值比较运算
set和multiset支持 >,>=,<,<=,!=,==比较运算。例如,若有集合c1,c2,可以用c1==c2,c1>c2对它们进行相等或大于判断。另外,可以用赋值运算符“=”进行集合赋值,如c1=c2.
(3)set和multiset计算容量
size() //计算容器大小
empty() //判断容器是否为空,若为空,则返回0
max_size() //返回容器能够保存的最大元素个数
(4)set和multiset常用操作
count(e) //计算集合中元素e的个数
find(e) //查找元素中第一次出现元素e的位置
lower_bound(e) //查找集合中第一个“元素值>=e”的位置
upper_bound(e) //查找集合中第一个“元素值>e”的位置
insert(e) //在当前集合中插入元素e;
insert(pos,e) //将e插入到pos位置
insert(beg,end) //将[beg,end]区间内的所有元素都插入到当前集合中
eraser(e) //删除集合中的元素e
erase(pos) //删除集合中指定pos的元素
erase(beg,end) //删除区间[beg,end]的所有元素
clear() //清空集合
begin() //指向第一个元素位置,常与迭代器结合使用
end() //指向最后一个元素位置,常与迭代器结合使用
简例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a1[]={-2,0,30,12,6,7,12,10,9,10};
set<int,greater<int> > set1(a1,a1+7);
set<int,greater<int> >::iterator p1;
set1.insert(12); set1.insert(12); set1.insert(4);
for(p1=set1.begin();p1!=set1.end();p1++)
cout<<*p1<<" ";
cout<<endl;
string a2[]={"杜明","王伟","张青山","李大海","黄明昊","刘一",
"张三","林海","王小二","张青山"};
multiset<string> set2(a2,a2+10);
multiset<string>::iterator p2;
set2.insert("杜明"); set2.insert("李泽");
for(p2=set2.begin();p2!=set2.end();p2++)
cout<<*p2<<" ";
cout<<endl;
string sname;
cout<<"输入要查找的姓名:";
cin>>sname;
p2=set2.begin();
bool s=false; //s用于判定找到姓名与否
while(p2!=set2.end())
{
if(sname==*p2)
{
cout<<*p2<<endl;
s=true;
}
p2++;
}
if(s==false) cout<<sname<<"不在集合中!"<<endl;
return 0;
}
输出结果:
30 12 7 6 4 0 -2
杜明 杜明 黄明昊 李大海 李泽 林海 刘一 王伟 王小二 张青山 张青山 张三
输入要查找的姓名:杜明
杜明
杜明