C++ STL set和multiset

在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
杜明 杜明 黄明昊 李大海 李泽 林海 刘一 王伟 王小二 张青山 张青山 张三
输入要查找的姓名:杜明
杜明
杜明

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值