• 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
  • 相关阅读:
    列表的基础应用
    掌握Conda配置:使用conda config --user命令
    web前端开发技术纯静态 (12306官网 1页)
    基于ssm物业报修管理系统毕业设计源码111024
    【Rust 基础篇】Rust动态大小类型:理解动态大小类型与编写安全的代码
    eNSP学习——RIP的路由引入
    小米5X手机IMEI成0
    邦永PM2项目管理系统 SQL注入漏洞复现
    派克斯电脑全局改IP如何辅助捉妖游戏
    Anaconda3使用Spark的正确方法
  • 原文地址:https://blog.csdn.net/pangyushuang/article/details/127946381