C++ STL 中的set, multiset——自定义元素类型

本文深入探讨了C++标准模板库(STL)中set与multiset的使用方法及区别,包括基本操作、元素插入与删除、自定义排序等。通过实例展示了如何创建大顶堆,并对自定义类型的元素进行排序。

在C++ STL中, set, multiset,都是基于实现的,此外 qriority_queue, map也是基于堆实现的,用法类似。

基本操作

#include<vector>
#include<set>
#include<iostream>
using namespace std;
int main() {
    //set的两种擦除方式
    set<int> s_less;
    s_less.insert(10);
    s_less.erase(10);//使用10作为参数擦除10

    s_less.insert(10);
    set<int>::iterator iter = s_less.find(10);//返回指向10的iterator
    s_less.erase(iter);//使用iterator擦除10

    //set与multiset的区别,如何设定为大顶堆
    s_less.clear();
    multiset<int> ms_less;
    multiset<int, greater<int>> ms_great;//指定为大顶堆

    vector<int> v = {2,1,3,8,4,5,0, 3};
    for (auto item:v){
        s_less.insert(item);
        ms_less.insert(item);
        ms_great.insert(item);
    }

    for (auto iter = s_less.begin(); iter!=s_less.end(); ++iter)
        cout << *iter << ' ';
    cout << endl;
    for (auto iter = ms_less.begin(); iter!=ms_less.end(); ++iter)
        cout << *iter << ' ';
    cout << endl;
    for (auto iter = ms_great.begin(); iter!=ms_great.end(); ++iter)
        cout << *iter << ' ';
    return 0;
}

输出:
在这里插入图片描述
结论:

  • multiset允许重复元素的存在,而set中元素是唯一的。
  • multiset和set都默认为小顶堆。
  • 使用set<int, greater>或multiset<int, greater>指定为大顶堆

堆中元素为自定义类型

set<Type, Functional>, 此时需要自己定义比较函数,即functional。

#include<iostream>
#include<vector>
#include<string>
#include<set>
using namespace std;

struct ListNode {
    string name;
    int chinese;
    int math;
    ListNode *next;
    ListNode(string nam, int c, int m) : name(nam), chinese(c), math(m), next(NULL) {}
};

bool cmp1(const ListNode* lhs, const ListNode* rhs) {
    return lhs->math > rhs->math;

}

int main()
{
    ListNode* List[4];
    List[0] = new ListNode("monica", 95, 90);
    List[1] = new ListNode("joe", 60, 59);
    List[2] = new ListNode("rose", 90, 95);
    List[3] = new ListNode("chandler", 85, 100);


    auto cmp = [](const ListNode* lhs, const ListNode* rhs) {return lhs->math > rhs->math; }; //函数指针
	
	//两种方式
    set<ListNode*, decltype(cmp)> Set(cmp);     //declytype(cmp)为函数指针类型
    set<ListNode*, decltype(cmp1)*> Set1(cmp1); //declytype(cmp1)为函数类型,加*变为函数指针类型

    //可以向set中插入ListNode*实例,并且这些ListNode*实例按照val构成大顶堆
    for (int i=0; i<4; ++i)
        Set.insert(List[i]);

    for (auto iter = Set.begin(); iter!=Set.end(); ++iter)
        cout << (*iter)->name << ' '<< (*iter)->chinese << ' '<< (*iter)->math << endl;

    return 0;
}

输出:
在这里插入图片描述
可以发现数据已经按照数学成绩排好了序。以上程序说明了set的用法,multiset用法类似。注意 set<Type, Functional>, functional是类型,所以要使用decltype。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值