美文网首页
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

    构造函数 赋值操作 大小操作 插入 删除 实例 查找 实例 更改set容器排序规则 自定义数据 寻找上下限 实例 ...

  • C++ STL 集合类常用记录

    STL中关于集合的容器主要是set,multiset,unordered_set和unordered_multis...

  • 30 STL(八)set/multiset容器

    P基本概念 set插入时会被自动排序,底层结构是二叉树实现。区别是set不允许有重复元素,而mulitset允许 ...

  • STL:set,multiset

    sethe和multiset会在插入元素时,若元素为常见类型,会对元素进行排序,可以自定义排序,默认为从小到大。

  • STL容器set基础使用

    STL容器之set 一、什么是set? set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,...

  • Boolan_STL与泛型编程_第三周笔记

    本周课程重点讲解了容器deque、容器queue、容器rb_tree、容器set/multiset、容器map/m...

  • STL细节

    容器分为三种1.序列性容器 vector list deque2.关联型容器 set multiset map...

  • STL(一)vector、set/multiset、list

    Vector 动态数据,可以随机访问。末尾添加和删除的效率高。元素的顺序和推入的顺序一致。 基本函数 push_b...

  • STL六大组件

    STL STL六大组件 1.容器(containers):各种数据结构,vector、list、queue、set...

  • STL源码解析(1)-红黑树

    STL源码解析(1)-红黑树 STL容器之红黑树实现 C++中map和set都是基于红黑树的实现, 其迭代器也是红...

网友评论

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

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