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

被折叠的 条评论
为什么被折叠?



