c++STL容器之set/multiset容器

2020-08-26 22:46:03 浏览数 (1)

1.所有元素在插入时就会被自动排序。

2.底层是二叉树的实现。

3.set中不允许有重复的元素,multiset里面允许有重复的元素。

一、构造函数

代码语言:javascript复制
set<T> st;
set(const set &st);

二、赋值

代码语言:javascript复制
set& operator(const set &st);

三、大小和交换

代码语言:javascript复制
size();
empty();
swap();

四、插入和删除

代码语言:javascript复制
insert(ele);
clear();
erase(pos);
erase(beg,end);
erase(ele);

五、查找和统计

代码语言:javascript复制
find(key);//查找key是否存在,若存在,则返回该键元素的迭代器,若不存在,则返回set.end();
count(key);//统计key的个数

六、对set进行排序

set默认排序是从小到大,可以利用仿函数,改变排序规则。

1.对内置数据类型进行排序

代码语言:javascript复制
#include<iostream>
using namespace std;
#include <set>

//set容器排序

class MyCompare
{
public:
    const bool operator()(int v1,int v2) const
    {
        return v1 > v2;
    }
};

void test01()
{
    set<int>s1;

    s1.insert(10);
    s1.insert(40);
    s1.insert(20);
    s1.insert(50);
    s1.insert(30);

    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(50);
    s2.insert(30);

    for (set<int, MyCompare>::iterator it = s2.begin(); it != s2.end(); it  )
    {
        cout << *it << " ";
    }
    cout << endl;
}

int main() {

    test01();

    system("pause");

    return 0;
}

输出:

需要注意的是vs2019重载operator()需要加const,不然会报错。

2.对自己定义的数据类型进行排序

代码语言:javascript复制
#include<iostream>
using namespace std;
#include <string>
#include <set>
//set容器排序,存放自定义数据类型

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) const
    {
        //按照年龄 降序
        return p1.m_Age > p2.m_Age;
    }

};

void test01()
{
    //自定义数据类型 都会指定排序规则
    set<Person, comparePerson>s;

    //创建Person对象
    Person p1("刘备", 24);
    Person p2("关羽", 28);
    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;
}

输出:

0 人点赞