STL-Set

STL-Set

1.insert


    set<int> s;
    s.insert(1);
    s.insert(5);
    s.insert(-5);
    s.insert(1);//重复元素不会被多次插入

2.find

  返回某个要查找元素的迭代器,如果元素不存在,则返回集合最后一个元素后面的一个位置,即end()。


    set<int>::iterator it;
    it = s.find(5);
    if(it != s.end())
        cout<< *it <<endl;
    else
        cout<<"Not find it" << endl;
    //如果元素存在也可以直接写成这样
    cout<<*(s.find(5))<<endl;

3.迭代器

  当需要遍历集合元素时,需要使用迭代器。


    set<int>::iterator it;
    for(it = s.begin();it != s.end();it++)
        cout<<*it<<" ";
    cout<<endl;

注意:不支持 it < s.end() 的写法

  当需要反向遍历集合时,可以使用反向迭代器reverse_iterator,输出的结果正好是集合元素的反向排序结果。它需要用到rbegin()和rend()两个方法,它们分别给出了反向遍历的开始位置和结束位置。


    set<int>::reverse_iterator rit;
    for(rit = s.rbegin();rit != s.rend();rit++)
        cout<<*rit<<" ";
    cout<<endl;

4.count

  返回元素在集合中出现的次数,由于 set 不会存在重复元素,所以 count() 函数的返回值为 1 或 0,该方法也可以用来判断在集合中是否存在某个元素。


    set<int> s;
    s.insert(1);
    s.insert(5);
    s.insert(-5);
    s.insert(1);

    if(s.count(-45))
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;

5.自定义比较函数

  使用insert将元素插入到集合中去的时候,集合会根据设定的比较函数奖该元素放到该放的节点上去。在定义集合的时候,如果没有指定比较函数,那么采用默认的比较函数,即按键值从小到大的顺序插入元素。但在很多情况下,需要自己编写比较函数。

  1. 如果元素不是结构体,那么可以编写比较函数。下面的程序比较规则为按键值从大到小的顺序插入到集合中。

    #include <iostream>
    #include <set>
    using namespace std;
    struct cmp{

        bool operator() (const int &a,const int &b){
            return a > b;
        }
    };
    int main(void){

        set<int,cmp>s;
        s.insert(5);
        s.insert(1);
        s.insert(6);
        s.insert(3);
        s.insert(5);

        set<int,cmp>::iterator it;
        for(it = s.begin(); it != s.end(); it++)
            cout << *it << " ";
        cout << endl;

        return 0;
    }
    /*
    运行结果:6 5 3 1   
    */
  1. 如果元素是结构体,那么可以直接把比较函数写在结构体内

    #include <iostream>
    #include <cstdio>
    #include <set>
    using namespace std;

    struct node{
        int data;
        node(){}
        node(int d):data(d){}

        bool operator < (const node &n) const{// 重载“<”操作符,自定义排序规则
            //按 data 由大到小排序。如果要由小到大排序,使用“>”即可。
            return n.data < data;
        }
    };
    int main(void){

        set<node> s;
        s.insert(node(5));
        s.insert(node(1));
        s.insert(node(6));
        s.insert(node(3));
        s.insert(node(5));

        set<node>::iterator it;
        for(it = s.begin(); it != s.end(); it++)
            cout << (*it).data << " ";
        cout << endl;
        return 0;
    }
    /*
    运行结果:6 5 3 1   
    */

  也可以把结构体和比较函数分开写,然后一起构建 set,像下面一样,效果和上面相同。



    #include <iostream>
    #include <set>
    using namespace std; 
    struct node{
        int data;
        node(){}
        node(int d):data(d){}
    };
    struct cmp1{
        bool operator() (const node &n1,const node &n2){
            return n1.data > n2.data;
        }
    };
    int main(void){

        set<node,cmp1> s;
        s.insert(node(5));
        s.insert(node(1));
        s.insert(node(6));
        s.insert(node(3));
        s.insert(node(5));

        set<node,cmp1>::iterator it;
        for(it = s.begin(); it != s.end(); it++)
            cout << (*it).data << " ";
        cout << endl;
        return 0;
    }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值