• c++ set/ multiset 容器 安静点


    set基本概念

    简介:

    • 所有元素都会在插入时自动被排序

    本质:

    • set/multiset属于关联式容器,底层结构是用二叉树实现。

    set和multiset区别

    • set不允许容器中有重复的元素
    • multiset允许容器中有重复的元素

      set构造和赋值

    功能描述:创建set容器以及赋值

    构造:

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

    赋值:

    • set& operator=(const set &st); //重载等号操作符

    示例:

    #include <set>
    
    void printSet(set<int> & s)
    {
        for (set<int>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    //构造和赋值
    void test01()
    {
        set<int> s1;
    
        s1.insert(10);
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
        printSet(s1);
    
        //拷贝构造
        set<int>s2(s1);
        printSet(s2);
    
        //赋值
        set<int>s3;
        s3 = s2;
        printSet(s3);
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    总结:

    • set容器插入数据时用insert
    • set容器插入数据的数据会自动排序

      set大小和交换

    功能描述:

    • 统计set容器大小以及交换set容器

    函数原型:

    • size(); //返回容器中元素的数目
    • empty(); //判断容器是否为空
    • swap(st); //交换两个集合容器

    示例:

    #include <set>
    
    void printSet(set<int> & s)
    {
        for (set<int>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    //大小
    void test01()
    {
    
        set<int> s1;
        
        s1.insert(10);
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
    
        if (s1.empty())
        {
            cout << "s1为空" << endl;
        }
        else
        {
            cout << "s1不为空" << endl;
            cout << "s1的大小为: " << s1.size() << endl;
        }
    
    }
    
    //交换
    void test02()
    {
        set<int> s1;
    
        s1.insert(10);
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
    
        set<int> s2;
    
        s2.insert(100);
        s2.insert(300);
        s2.insert(200);
        s2.insert(400);
    
        cout << "交换前" << endl;
        printSet(s1);
        printSet(s2);
        cout << endl;
    
        cout << "交换后" << endl;
        s1.swap(s2);
        printSet(s1);
        printSet(s2);
    }
    
    int main() {
    
        //test01();
    
        test02();
    
        system("pause");
    
        return 0;
    }

    总结:

    • 统计大小 --- size
    • 判断是否为空 --- empty
    • 交换容器 --- swap

    set插入和删除

    功能描述:

    • set容器进行插入数据和删除数据

    函数原型:

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

    示例:

    #include <set>
    
    void printSet(set<int> & s)
    {
        for (set<int>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    //插入和删除
    void test01()
    {
        set<int> s1;
        //插入
        s1.insert(10);
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
        printSet(s1);
    
        //删除
        s1.erase(s1.begin());
        printSet(s1);
    
        s1.erase(30);
        printSet(s1);
    
        //清空
        //s1.erase(s1.begin(), s1.end());
        s1.clear();
        printSet(s1);
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

     set查找和统计

    功能描述:

    • 对set容器进行查找数据以及统计数据

    函数原型:

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

    示例:

    #include <set>
    
    //查找和统计
    void test01()
    {
        set<int> s1;
        //插入
        s1.insert(10);
        s1.insert(30);
        s1.insert(20);
        s1.insert(40);
        
        //查找
        set<int>::iterator pos = s1.find(30);
    
        if (pos != s1.end())
        {
            cout << "找到了元素 : " << *pos << endl;
        }
        else
        {
            cout << "未找到元素" << endl;
        }
    
        //统计
        int num = s1.count(30);
        cout << "num = " << num << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    总结:

    • 查找 --- find (返回的是迭代器)
    • 统计 --- count (对于set,结果为0或者1)

    set和multiset区别

    学习目标:

    • 掌握set和multiset的区别

    区别:

    • set不可以插入重复数据,而multiset可以
    • set插入数据的同时会返回插入结果,表示插入是否成功
    • multiset不会检测数据,因此可以插入重复数据

    示例:

    #include <set>
    
    //set和multiset区别
    void test01()
    {
        set<int> s;
        pair<set<int>::iterator, bool>  ret = s.insert(10);
        if (ret.second) {
            cout << "第一次插入成功!" << endl;
        }
        else {
            cout << "第一次插入失败!" << endl;
        }
    
        ret = s.insert(10);
        if (ret.second) {
            cout << "第二次插入成功!" << endl;
        }
        else {
            cout << "第二次插入失败!" << endl;
        }
        
        //multiset
        multiset<int> ms;
        ms.insert(10);
        ms.insert(10);
    
        for (multiset<int>::iterator it = ms.begin(); it != ms.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    总结:

    • 如果不允许插入重复数据可以利用set
    • 如果需要插入重复数据利用multiset

     set容器排序

    学习目标:

    • set容器默认排序规则为从小到大,掌握如何改变排序规则

    主要技术点:

    • 利用仿函数,可以改变排序规则

    示例一 set存放内置数据类型

    #include <set>
    
    class MyCompare 
    {
    public:
        bool operator()(int v1, int v2) {
            return v1 > v2;
        }
    };
    void test01() 
    {    
        set<int> s1;
        s1.insert(10);
        s1.insert(40);
        s1.insert(20);
        s1.insert(30);
        s1.insert(50);
    
        //默认从小到大
        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(30);
        s2.insert(50);
    
        for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    
    int main() {
    
        test01();
    
        system("pause");
    
        return 0;
    }

    示例二 set存放自定义数据类型

    #include <set>
    #include <string>
    
    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)
        {
            //按照年龄进行排序  降序
            return p1.m_Age > p2.m_Age;
        }
    };
    
    void test01()
    {
        set<Person, comparePerson> s;
    
        Person p1("刘备", 23);
        Person p2("关羽", 27);
        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;
    }
  • 相关阅读:
    与灵感之源的vb.net对应的SmartExcel的C#版本
    winform下提高control在UI中的响应速度
    做了一个petoolkit的gui版本,放几张图上来。
    Reflection中对于out类型的获取
    对企业管理软件“代码后”问题的思考
    看了dannyr的java中文类,自己写了一个。
    所有的WMI可以使用的class
    庆祝浪潮集团成为微软在中国的第四家全球战略合作伙伴!(暂时放首页两天)
    一种系统间集成的同步事务异常处理方法和装置
    一种实现多线并行拣选的方法
  • 原文地址:https://www.cnblogs.com/anjingdian/p/16213325.html
Copyright © 2020-2023  润新知