zoukankan      html  css  js  c++  java
  • c++STL容器之set/multiset容器

    1.所有元素在插入时就会被自动排序。

    2.底层是二叉树的实现。

    3.set中不允许有重复的元素,multiset里面允许有重复的元素。

    一、构造函数

    set<T> st;
    set(const set &st);

    二、赋值

    set& operator(const set &st);

    三、大小和交换

    size();
    empty();
    swap();

    四、插入和删除

    insert(ele);
    clear();
    erase(pos);
    erase(beg,end);
    erase(ele);

    五、查找和统计

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

    六、对set进行排序

    set默认排序是从小到大,可以利用仿函数,改变排序规则。

    1.对内置数据类型进行排序

    #include<iostream>
    using namespace std;
    #include <set>
    
    //set容器排序
    
    class MyCompare
    {
    public:
        const bool operator()(int v1,int v2) const
        {
            return v1 > v2;
        }
    };
    
    void test01()
    {
        set<int>s1;
    
        s1.insert(10);
        s1.insert(40);
        s1.insert(20);
        s1.insert(50);
        s1.insert(30);
    
        for (set<int>::iterator it = s1.begin(); it != s1.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    
        //指定排序规则为从大到小
        set<int, MyCompare>s2;
    
        s2.insert(10);
        s2.insert(40);
        s2.insert(20);
        s2.insert(50);
        s2.insert(30);
    
        for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    输出:

    需要注意的是vs2019重载operator()需要加const,不然会报错。 

    2.对自己定义的数据类型进行排序

    #include<iostream>
    using namespace std;
    #include <string>
    #include <set>
    //set容器排序,存放自定义数据类型
    
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Name = name;
            this->m_Age = age;
        }
        string m_Name;
        int m_Age;
    };
    
    class comparePerson
    {
    public:
        bool operator()(const Person& p1, const Person& p2) const
        {
            //按照年龄 降序
            return p1.m_Age > p2.m_Age;
        }
    
    };
    
    void test01()
    {
        //自定义数据类型 都会指定排序规则
        set<Person, comparePerson>s;
    
        //创建Person对象
        Person p1("刘备", 24);
        Person p2("关羽", 28);
        Person p3("张飞", 25);
        Person p4("赵云", 21);
    
        s.insert(p1);
        s.insert(p2);
        s.insert(p3);
        s.insert(p4);
    
        for (set<Person, comparePerson>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << "姓名: " << it->m_Name << " 年龄: " << it->m_Age << endl;
        }
    
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    输出:

  • 相关阅读:
    2014最后一篇英语笔记(新开始)
    记录:CSS特殊性——权值规则
    grunt--自动化打包工具使用
    【移动端】---点透事件
    [前端性能提升]--图片转化为base64
    js--cookie
    1.倒数几秒弹窗关闭
    ES6就是ES2015 的主要内容
    call 与 apply的区别
    34枚金币时间管理法
  • 原文地址:https://www.cnblogs.com/xiximayou/p/12112058.html
Copyright © 2011-2022 走看看