STL-set

本文详细介绍了C++中set容器的自动排序特性、只读迭代器、查找操作、自定义排序规则(仿函数)以及如何存储自定义数据并重载比较运算符。涵盖了set容器的关键用法和相关技术,适合开发者提升对高级数据结构的理解。
摘要由CSDN通过智能技术生成

1. set容器的特点:

	所有元素都会根据元素的键值自动被排序。

2. set容器提供的是只读迭代器const_iterator,用户不可以修改set容器的元素

#include <iostream>
#include<set>
#include<algorithm>
using namespace std;
void test01()//自动根据键值排序
{
    set<int>s;
    s.insert(30);
    s.insert(10);
    s.insert(20);
    s.insert(50);
    s.insert(40);
    for_each(s.begin(),s.end(),[](int val){
        cout<<val<<" ";
    });
    cout<<endl;
    set<int>::const_iterator it=s.begin();
#if 0
    *it=100;//只读迭代器。const_iterator 不可更改数据
#endif
}

3. set的查找,找到返回该元素的迭代器,找不到返回end, s.count(key),统计key的元素个数

void test02()//set的查找,找到返回该元素的迭代器,找不到返回end,
{            //s.count(key),统计key的元素个数

    set<int>s;
    s.insert(30);
    s.insert(10);
    s.insert(20);
    s.insert(50);
    s.insert(40);
    set<int>::const_iterator it;
    it=s.find(20);
    if(it==s.end())
    {
        cout<<"没有找到"<<endl;
    }
    else
    {
        cout<<"找到"<<*it<<endl;
    }
   cout<<s.count(30)<<endl;
   cout<<s.count(100)<<endl;
}

4.对组[两种方法]

void test03()//对组[两种方法]
{
    pair<int,string> pair1(9527,"星爷");//方式1

    cout<<pair1.first<<" "<<pair1.second<<endl;

    pair<int,string> pair2=make_pair(10096,"移动");

    cout<<pair2.first<<" "<<pair2.second<<endl;
}

5.使用仿函数更改默认排序规则

class MyGreater
{
public:
    bool operator ()( int val1,int val2)
    {
        return val1>val2;
    }
};
void test04()//更改set的默认排序规则(推荐使用仿函数)
{
    //又要是类型,又要当函数用---仿函数
    set<int,MyGreater>s;
    s.insert(30);
    s.insert(10);
    s.insert(20);
    s.insert(50);
    s.insert(40);
    for_each(s.begin(),s.end(),[](int val){
        cout<<val<<" ";
    });
            cout<<endl;
}

6.set存放自定义数据时需重载’<’运算符

class Person
{
public:
    string name;
    int age;
    Person(string name,int age)
    {
        this->name=name;
        this->age=age;
    }

    bool operator<(const Person& ob)const
    //单纯的告诉编译器 该函数为常函数不会修改成员数据
    //常对象 调用 常函数
    {
        return this->age<ob.age;
    }
	//【先重载<,才能再指定排序规则】。
};
void test05()//set存放【自定义数据】时重载<操作符
{
    set<Person>s;
    s.insert(Person("德玛西亚",19));
    s.insert(Person("小法",18));
    s.insert(Person("小炮",21));
    s.insert(Person("风男",29));
    for_each(s.begin(),s.end(),[](Person val){
        cout<<val.name<<" "<<val.age<<endl;
    });

}

7.set存放自定义数据时指定排序规则【仿函数】

class MyGreaterPerson
{
public:
    bool operator()(const Person &ob1,const Person &ob2)
    {
        return ob1.age>ob2.age;
    }
};
void test06()//set存放自定义数据时指定排序规则【仿函数】
{
    set<Person,MyGreaterPerson>s;
    s.insert(Person("德玛西亚",19));
    s.insert(Person("小法",18));
    s.insert(Person("小炮",21));
    s.insert(Person("风男",29));
    for_each(s.begin(),s.end(),[](Person val){
        cout<<val.name<<" "<<val.age<<endl;
    });
}

8.multiset可以插入相同元素的值

void test07()//multiset可以插入相同元素的值
{
    multiset<int>s;
    s.insert(10);
    s.insert(10);
    for_each(s.begin(),s.end(),[](int val){
        cout<<val<<endl;
    });
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值