• C++ 笔记 18 (STL常用容器 - set & multiset)


    三. STL常用容器

    8. set / multiset容器

    8.1 set基本概念

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

    set(集合)/multiset(多重集合)属于关联式容器,底层结构是用二叉树实现

    set和multiset区别:
    set不允许容器中有重复的元素,multiset允许容器中有重复的元素

    8.2 set构造和赋值
    set<int>s1;
    
    set.insert(10);
    
    set<int>s2(s1);  //拷贝构造
    
    s3=s2;  //赋值
    
    //set容器插入数据时用insert
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    8.3 set大小和交换
    s1.empty();
    
    s1.size();
    
    s1.swap(s2);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    8.4 set插入和删除
    s1.insert(10);
    
    //删除s1.begin()迭代器所指元素,返回下一个元素的迭代器
    s1.erase(s1.begin());  
    
    s1.clear();  //清空
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    8.5 set查找和统计
    set<int>::iterator pos = s1.find(30);
    if(pos != s1.end())
    {
    	cout<<"找到了元素:"<<* pos<<endl;
    }
    else
    {
    	cout<<"未找到元素"<<endl;
    }
    /*-----------------------------------------------*/
    find(key); /*查找key是否存在,若存在,返回该键的元素的迭代器;
    					若不存在,返回set.end()*/
    
    int num = s1.count(30);  //统计key的元素个数
    //对于set, count结果为0或1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    8.6 set 和 multiset区别

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

    8.7 pair对组创建

    成对出现的数据,利用对组可以返回两个数据

    两种创建方式:

    pair <type,type> p (value1,value2);
    pair <type,type> p =make_pair(value1,value2);
    
    pair<string,int>p ("Tom",20);
    cout<<"姓名:"<<p.first<<"年龄:"<<p.second<<endl;
    
    pair<string,int> p2 = make_pair("Jerry",20);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    8.8 set容器排序

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

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

    /*第一种*/
    class Mycompare
    {
    	public:
    		bool operator() (int v1, int v2)
    		{
    			return v1>v2;
    		}
    };
    ...
    set<int,Mycompare>s2;
    ...
    for(set<int,Mycompare>::iterator it = s2.begin();it!=s2.end(); it++)
    {
    	cout<<*it<<"";
    }
    //set存放内置数据类型,利用仿函数可以指定set容器的排序规则
    
    /*第二种*/
    class Person
    {
    	...
    };
    
    class Compareperson
    {
    	public:
    		bool operator() (const Person& p1,const Person & p2)
    		{
    			return p1.m_Age > p2.m_Age;
    		}
    };
    ...
    for(set<Person, ComparePerson>::iterator it =s.begin(); 
    		it!=s.end();it++)
    {
    	cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
    }
    
    //对于自定义数据类型,set必须指定排序规则才可以插入数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    XCIE-HUAWEI-Cisco-思科-华为-华三堆叠(理论+实操)
    面向海洋观监测传感网的移动终端位置隐私保护研究
    Java之IO流02
    Word控件Spire.Doc更新至最新版v10.7,增强产品稳定性,修复老版本漏洞
    【技术分享】NetLogon于域内提权漏洞(CVE-2020-1472)
    中国单反相机行业供需趋势及投资风险研究报告
    手写一个民用Tomcat (05)
    四、JAVA语言基础
    c++中的map和set
    颠覆与创新:探寻Facebook未来的发展路径
  • 原文地址:https://blog.csdn.net/pangyushuang/article/details/127946381