• STL容器之set容器API(二)无重复元素原理、set容器排序、自定义数据


    1.set如何实现无重复元素

    void printSet(set<int>& s)
    {
        for (set<int>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    //set实现无重复元素原理
    void test01()
    {
    
        set<int> s;
        //set实现无重复元素 insert处F12转到定义
        /*
        template <bool _Multi2 = _Multi, enable_if_t<!_Multi2, int> = 0>
        pair<iterator, bool> insert(value_type&& _Val) {
            const auto _Result = _Emplace(_STD move(_Val));
            return {iterator(_Result.first, _Get_scary()), _Result.second};
        }
        */
        //插入后返回对组 第一个为迭代器 第二个是bool  是否插入成功
        pair<set<int>::iterator, bool> ret = s.insert(10);
        if (ret.second)
        {
            cout << "插入结果: " << ret.second << ", 数值为:" << *(ret.first) << endl;  //bool转数值 1为true 0为false
        }
        else {
            cout << "插入结果:" << ret.second << endl;
        }
        s.insert(10);
        ret = s.insert(10);     //再次插入
        if (ret.second)
        {
            cout << "第二次插入结果: "<< ret.second << ", 数值为:" << *(ret.first) << endl;
        }
        else {
            cout << "第二次插入结果:" << ret.second << endl;
        }
        printSet(s);
    }

    结果:

    2.set容器排序

    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    using namespace std;
    #include <set>
    
    void printSet(set<int>& s)
    {
        for (set<int>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
    //set实现无重复元素原理
    void test01()
    {
    
        set<int> s;
        //set实现无重复元素 insert处F12转到定义
        /*
        template <bool _Multi2 = _Multi, enable_if_t<!_Multi2, int> = 0>
        pair<iterator, bool> insert(value_type&& _Val) {
            const auto _Result = _Emplace(_STD move(_Val));
            return {iterator(_Result.first, _Get_scary()), _Result.second};
        }
        */
        //插入后返回对组 第一个为迭代器 第二个是bool  是否插入成功
        pair<set<int>::iterator, bool> ret = s.insert(10);
        if (ret.second)
        {
            cout << "插入结果: " << ret.second << ", 数值为:" << *(ret.first) << endl;  //bool转数值 1为true 0为false
        }
        else {
            cout << "插入结果:" << ret.second << endl;
        }
        s.insert(10);
        ret = s.insert(10);     //再次插入
        if (ret.second)
        {
            cout << "第二次插入结果: "<< ret.second << ", 数值为:" << *(ret.first) << endl;
        }
        else {
            cout << "第二次插入结果:" << ret.second << endl;
        }
        printSet(s);
    }
    //set容器排序
    //仿函数 为什么要用仿函数  仿函数是类 仿函数才是一种数据类型 而函数不是 不能作为set创建的类型
    class myCompare
    {
    public:
        bool operator()(const int v1,const int v2)const //同样 重载的时候需要只读属性 加const
        {
            return v1 > v2;
        }
    };
    void test02()
    {
        
        //关联式容器, 插入数据 key自动按从小到大排序
        //如何从大到小排序
        //插入之后无法改变 只能插入之前指定排序规则
        set<int, myCompare>s1;  //set<数据类型1,数据类型2>
        s1.insert(5);
        s1.insert(1);
        s1.insert(9);
        s1.insert(7);
        s1.insert(3);
        //printSet(s1);       //1 3 5 7 9
        for (set<int, myCompare>::iterator it = s1.begin(); it != s1.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;  //9 7 5 3 1
       
     }
    
    int main()
    {
        test02();
        //test01();
        system("Pause");
        return 0;
    }

    结果:

    自定义数据

    //自定义数据类型
    class Person
    {
    public:
        Person(string name, int age)
        {
            this->m_Age = age;
            this->m_Name = name;
        }
        string m_Name;
        int m_Age;
    };
    class personCompare     //排序规则
    {
    public:
        bool operator()(const Person& p1,const Person& p2)const
        {
            return p1.m_Age > p2.m_Age;
        }
    };
    void test03()
    {
        set<Person, personCompare> s;
        Person p1("大娃", 20);
        Person p2("二娃", 19);
        Person p3("三娃", 18);
        Person p4("爷爷", 100);
        s.insert(p1);
        s.insert(p2);
        s.insert(p3);
        s.insert(p4);
        for (set<Person, personCompare>::iterator it = s.begin(); it != s.end(); it++)
        {
            cout << "姓名: " << (*it).m_Name << " 年龄: " << it->m_Age << endl;
        }
    }

    结果:

  • 相关阅读:
    python 扁平列表转树状字典
    在Windows Server2012中通过DockerToolbox 一步一步搭建Mysql 数据库存运行环境
    腾讯云ubuntu服务器安装图像化界面并实现远程登陆
    IIS、apache、tomcat服务器虚拟主机配置
    微信商家二维码到底是什么
    线程与线程锁---python版本(附带线程锁实例)
    pip更新后仍旧是使用的旧版本
    pip更新后仍旧是使用的旧版本
    H5-LocalStorage
    Python摄像头抓拍的彩色图像转为灰度图、二值化和调整图片尺寸(实例)
  • 原文地址:https://www.cnblogs.com/yifengs/p/15193885.html
Copyright © 2020-2023  润新知