STL标准函数库 set容器(multiset)

1.set的功能

数据存入其中后会自动去重,自带排序。

虽然set自动去重,但是仍然可以用count()求出某一点重复数据的个数 set容器中不允许重复元素,multiset允许重复元素

set在访问元素的时候不能按照下标来访问,只能做到遍历访问。我们想要按照下标来访问set内部的元素,可以把set内部的元素存放在vector里面。*

2.set常用操作:

set<int> s;
set<double> ss;
multiset<int> ms;     //允许重复

set的基本操作:
s.begin()                               //返回指向第一个元素的迭代器
s.clear()                               //清除所有元素
s.count()                               //返回某个值元素的个数
s.empty()                               //如果集合为空,返回true(真)
s.end()                                 //返回指向最后一个元素之后的迭代器,不是最后一个元素
s.erase()                               //删除集合中的元素
s.find()                                //返回一个指向被查找到元素的迭代器
s.insert()                              //在集合中插入元素
s.lower_bound()                         //返回指向大于(或等于)某值的第一个元素的迭代器
s.size()                                //集合中元素的数目
s.swap()                                //交换两个集合变量
s.upper_bound()                         //返回大于某个值元素的迭代器
set<int> s;

s.erase(2);        //删除键值为2的元素
s.clear();

//元素检索:find(),若找到,返回该键值迭代器的位置,否则,返回最后一个元素后面一个位置。

set<int>::iterator it;
it=s.find(5);    //查找键值为5的元素
if(it!=s.end())    //找到
   cout<<*it<<endl;
else            //未找到
   cout<<"未找到";


//自定义比较函数
    (1)元素不是结构体:
        例:
        //自定义比较函数myComp,重载“()”操作符
        struct myComp
        {
            bool operator()(const your_type &a,const your_type &b)
            [
                return a.data-b.data>0;
            }
        }
        set<int,myComp>s;
        ......
        set<int,myComp>::iterator it;
    (2)如果元素是结构体,可以直接将比较函数写在结构体内。
        例:
        struct Info
        {
            string name;
            float score;
            //重载“<”操作符,自定义排序规则
            bool operator < (const Info &a) const
            {
                //按score从大到小排列
                return a.score<score;
            }
        }

3.举例

#include<iostream>
#include<set>
#include<cstdio>
using namespace std;
int main(){
    set<int> s;

    //插入元素
    s.insert(1);
    s.insert(3);
    s.insert(5);

    //查找元素
    set<int>::iterator ite;

    ite=s.find(1);  //查找键值为1的元素
    if(ite==s.end()) puts("not find");
    else puts("find");

    ite=s.find(2);
    if(ite==s.end()) puts("not find");
    else puts("find");

    //删除元素
    s.erase(3);

    //其他的查找元素的方法
    if(s.count(3)!=0) puts("find");
    else puts("no find");

    //遍历所有的元素
    for(ite=s.begin();ite!=s.end();++ite)
        cout<<*ite<<endl;

    return 0;
}
#include<bits/stdc++.h>
using namespace std;
set<int> s;
int main(){
    s.insert(1);
    s.insert(3);
    s.insert(4);
    cout<<*lower_bound(2)<<endl;  //输出3,返回第一个大于等于
    cout<<*lower_bound(3)<<endl;  //输出3
    cout<<*upper_bound(3)<<endl;  //输出4,返回第一个大于
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值