自定义结构体,优先队列如何重载运算符

语言:c++

头文件:queue

首先是 std::less和std::greater两个模板的使用

1
2
3
4
5
6
   template<typename _Iterator, typename _Value>
bool
operator()(_Iterator __it, _Value& __val)
{ return bool(_M_comp(*__it, __val)); }
};

less需要重载结构体的小于 以下内容语言描述很抽象 直接看演示

(友元函数省略 因为跟结构体内重载一个意思)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct data1{
int num;
int time;
std::string name;
bool operator <(const data1&a)const{//这里最后const不加会报错的//这里引用 是因为引用更快一点
return num>a.num;
}
};
signed main()
{
std::priority_queue<data1,std::vector<data1>,std::less<data1>>q;
std::string str="aa";
for(int i=1; i<=10; i++)
q.push({i,i+10,str});
while(q.size()){
auto cc=q.top();
q.pop();
std::cout<<cc.num<<"\n";
}
}

得到的为:1,2,3,4,5,6,7,8,9,10;

如果<是下面方式重载的话 得到的结果为:10,9,8,7,6,5,4,3,2,1

1
2
3
4
bool operator <(const data1&a)const
{
return num<a.num;
}

你想定义的顺序跟优先队列出来的恰恰相反

然后 是greater 模板代码如下 可以看出greater需要重载的是>

1
2
3
4
5
6
7
8
template<typename _Tp>
struct greater : public binary_function<_Tp, _Tp, bool>
{
_GLIBCXX14_CONSTEXPR
bool
operator()(const _Tp& __x, const _Tp& __y) const
{ return __x > __y; }
};

greater恰好于less相反

1
2
3
4
5
6
7
8
std::priority_queue<data1,std::vector<data1>,std::greater<data1>>q;

bool operator >(const data1&a)const{
return num<a.num;
}// 得到的结果为:10,9,8,7,6,5,4,3,2,1
bool operator >(const data1&a)const{
return num>a.num;
}得到的为:1,2,3,4,5,6,7,8,9,10;

greater也是想定义的顺序跟优先队列出来的恰恰相反

由上推出:

当为非结构体时(不需要重载的基本类型) less是大根堆,greater是小根堆,而优先队列默认的是大根堆。

自定义比较结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct cmp{
bool operator ()(const data1 &a, const data1 &b)
{
return a.num<b.num;// 按照num从小到大排列
}
};
struct cmp{
bool operator ()(const data1 &a, const data1 &b)
{
return a.num>b.num;// 按照num从大到小排列
}
};
std::priority_queue<data1,std::vector<data1>,cmp>q;//

敬请斧正。

所以呢就别不快乐。