美文网首页
STL容器之set/multiset

STL容器之set/multiset

作者: 二进制人类 | 来源:发表于2022-10-11 19:07 被阅读0次

    构造函数

    set<T> st;//set 默认构造函数:
    mulitset<T> mst; //multiset 默认构造函数:
    set(const set &st);//拷贝构造函数
    

    赋值操作

    set& operator=(const set &st);//重载等号操作符
    swap(st);//交换两个集合容器
    

    大小操作

    size();//返回容器中元素的数目
    empty();//判断容器是否为空
    

    插入 删除

    insert(elem);//在容器中插入元素。
    clear();//清除所有元素
    erase(pos);//删除 pos 迭代器所指的元素,返回下一个元素的迭代器。
    erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
    erase(elem);//删除容器中值为 elem 的元素。
    

    实例

    #include <iostream>
    #include <set>
    using namespace std;
    void printSetInt(set<int> &s)
    {
        set<int>::const_iterator it=s.begin();
        for(;it!=s.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    int main()
    {
        set<int> s1;
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
        s1.insert(50);
        s1.insert(10);
        
        printSetInt(s1);//10 20 30 40 50
        return 0;
    }
    

    查找

    find(key);//查找键 key 是否存在,若存在,返回该键的元素的迭代器;若不存在,返回 set.end();
    count(key);//查找键 key 的元素个
    

    实例

    #include <iostream>
    #include <set>
    using namespace std;
    void printSetInt(set<int> &s)
    {
        set<int>::const_iterator it=s.begin();
        for(;it!=s.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    int main()
    {
        set<int> s1;
            s1.insert(30);
            s1.insert(20);
            s1.insert(40);
            s1.insert(50);
            s1.insert(10);
    
            printSetInt(s1);//10 20 30 40 50
    
            set<int>::const_iterator ret;
            ret = s1.find(40);
            if(ret != s1.end())
            {
                cout<<"找到的值为:"<<*ret<<endl;//40
            }
    
            //count(key);统计key值的个数 结果必定是0或1 (key值是不重复的)
            cout<<s1.count(40)<<" "<<s1.count(400)<<endl;//1 0
        return 0;
    }
    
    

    更改set容器排序规则

    #include <iostream>
    #include <set>
    using namespace std;
    //更改set容器的规则 只能使用仿函数
    class MyGreater
    {
    public:
        bool operator()(int v1, int v2)
        {
            return v1>v2;
        }
    };
    void printSetInt(set<int,MyGreater> &s)
    {
        set<int,MyGreater>::const_iterator it=s.begin();
        for(;it!=s.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    int main()
    {
        set<int,MyGreater> s1;
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
        s1.insert(50);
        s1.insert(10);
        printSetInt(s1);//50 40 30 20 10
        return 0;
    }
    
    

    自定义数据

    #include <iostream>
    #include <set>
    using namespace std;
    class Hero;
    class MyGreaterHero;
    class Hero
    {
        friend class MyGreaterHero;
        friend void printSetHero(set<Hero, MyGreaterHero> &s);
    private:
        string name;
        int def;
        int atk;
    public:
        Hero(){}
        Hero(string name, int def, int atk):name(name),def(def),atk(atk){}
    #if 0
        //重载运算符<
        bool operator<(const Hero ob)const
        {
            return this->def < ob.def;
        }
    #endif
    };
    
    class MyGreaterHero
    {
    public:
        bool operator()(Hero ob1, Hero ob2)
        {
            return ob1.def<ob2.def;
        }
    };
    void printSetHero(set<Hero, MyGreaterHero> &s)
    {
        set<Hero, MyGreaterHero>::const_iterator it=s.begin();
        for(;it!=s.end();it++)
        {
            cout<<(*it).name<<" "<<(*it).def<<" "<<(*it).atk<<endl;
        }
    }
    int main()
    {
        set<Hero, MyGreaterHero> s;
        s.insert(Hero("小法", 79, 80));
        s.insert(Hero("盲僧", 60, 90));
        s.insert(Hero("剑圣", 59, 70));
        s.insert(Hero("提莫", 49, 90));
        s.insert(Hero("鳄鱼", 89, 70));
        printSetHero(s);
        /*
         提莫 49 90
         剑圣 59 70
         盲僧 60 90
         小法 79 80
         鳄鱼 89 70
        */
        return 0;
    }
    
    

    寻找上下限

    lower_bound(keyElem);//返回第一个 key>=keyElem 元素的迭代器。
    upper_bound(keyElem);//返回第一个 key>keyElem 元素的迭代器。
    equal_range(keyElem);//返回容器中 key 与 keyElem 相等的上下限的两个迭代器。
    

    实例

    #include <iostream>
    #include <set>
    using namespace std;
    
    int main()
    {
        set<int> s1;
           s1.insert(30);
           s1.insert(20);
           s1.insert(40);
           s1.insert(50);
           s1.insert(10);
           //10 20 30 40 50
           //寻找30的下限
           set<int>::const_iterator ret;
           ret = s1.lower_bound(30);
           if(ret != s1.end())
           {
               cout<<"lower_bound(30)的下限为:"<<*ret<<endl;//30
           }
    
           ret = s1.upper_bound(30);
           if(ret != s1.end())
           {
               cout<<"upper_bound(30)的上限为:"<<*ret<<endl;//40
           }
    
           //对组:pair<第一个值的类型, 第二个值的类型>
           //first访问第一个值  second访问第二个值
           pair<set<int>::const_iterator , set<int>::const_iterator> pr;
           pr = s1.equal_range(30);
           if(pr.first != s1.end())
           {
               cout<<"lower_bound(30)的下限为:"<<*(pr.first)<<endl;//30
           }
           if(pr.second != s1.end())
           {
               cout<<"upper_bound(30)的上限为:"<<*(pr.second)<<endl;//40
           }
        return 0;
    }
    
    

    multiset容器

    void printSetInt(multiset<int> &s)
    {
        multiset<int>::const_iterator it=s.begin();
        for(;it!=s.end();it++)
        {
            cout<<*it<<" ";
        }
        cout<<endl;
    }
    
    void test(){
       multiset<int> s;
       s.insert(30);
       s.insert(20);
       s.insert(40);
       s.insert(20);
       s.insert(20);
    
       printSetInt(s); //20 20 20 30 40
    }
    

    相关文章

      网友评论

          本文标题:STL容器之set/multiset

          本文链接:https://www.haomeiwen.com/subject/deooartx.html