STL中使用greater比较器必须重载<的条件是什么

cmdblock 2013-05-24 08:14:09
比如有下面两个程序,第一个没有重载<而编译失败,可是第二个程序也没有重载<却获得了成功。
两个都用了greater降序排序。
1.编译失败
#include <list>
#include <algorithm>
#include <string>
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <functional>
#include <set>
#include <vector>
#include <iterator>
using namespace std;

class A{
public:
int id;
double energy;
bool operator> (const A& a) const{
return this->energy > a.energy;
}
friend ostream& operator<< (ostream& ct, const A& a)
{
ct << a.id << " " << a.energy << endl;
return ct;
}
};

class B{
public:
set<A> _l2;
};

int main(){
B b;
for(int i = 0; i < 10; i++) {
A a;
a.id = i;
a.energy = rand() % 10;
b._l2.insert(a);
}
copy(b._l2.begin(), b._l2.end(), ostream_iterator<A>(cout, ""));
cout << endl;
vector<A>v(b._l2.begin(), b._l2.end());//拷贝到vector
// copy(v.begin(), v.end(), ostream_iterator<A>(cout, ""));
// cout << endl;
sort(v.begin(), v.end(), greater<A>());//降序排序
copy(v.begin(), v.end(), ostream_iterator<A>(cout, ""));
cout << endl;
copy(v.begin(), v.end(), inserter(b._l2, b._l2.end()));//拷贝到set
copy(b._l2.begin(), b._l2.end(), ostream_iterator<A>(cout, ""));
return 0;
}

2.编译成功
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
using namespace std;

//for_each 的谓词,为了输出不同的对象, 这里利用了函数对象
template<class T>
class Display: public binary_function<T, T,bool>
{
public:
void operator()(const T& a)
{
cout<<a<<endl;
}
};


class A //待排序的类
{
public:
A(int i,int j): m_i(i),m_j(j){}
friend ostream& operator<<(ostream& out, const A& a)
{
out<< a.m_i << " " << a.m_j << endl;
return out;
}
bool operator> (const A& a)const
{
return this->m_j > a.m_j;
}
private:
int m_i;
double m_j;
};
template<class T>
class Greater: public binary_function<T, T,bool>
{
public:
bool operator()(const T& a, const T& b)
{
return a > b;
}
};

int main()
{
vector<A> Avec;
A a1(3,5);
A a2(8,3);
A a3(2,4.3);
A a4(6,8);
Avec.push_back(a1);
Avec.push_back(a2);
Avec.push_back(a3);
Avec.push_back(a4);

// sort(Avec.begin(), Avec.end(),Greater<A>());//自己的Greater函数
sort(Avec.begin(), Avec.end(), greater<A>());//系统的greater函数
for_each(Avec.begin(), Avec.end(), Display<A>());//输出降序排列对象容器
return 0;
}
...全文
366 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-05-25
  • 打赏
  • 举报
回复
错误信息发上来。如果你用的老编译器 (vc6.0 or vs200x where x < 2012),在两个 >> 中间加个空格试一下,set<A,std::greater<A> >.
cmdblock 2013-05-25
  • 打赏
  • 举报
回复
引用 1 楼 ri_aje 的回复:
跟 greater 没关系,原因在于 std::set 默认使用 < 进行排序,编译器说的是 B::_l2 的类型有问题,A 不支持 < 排序,而 set 实例化的时候要求,所以失败。改成这样就好了。

class B{
public:
    set<A,std::greater<A>> _l2;
};
可是我按照你的写法改后编译依然通不过
buyong 2013-05-25
  • 打赏
  • 举报
回复
第二个重载了operator> ,第一个没有
yshuise 2013-05-25
  • 打赏
  • 举报
回复
第二种才是正常用法。
ri_aje 2013-05-24
  • 打赏
  • 举报
回复
跟 greater 没关系,原因在于 std::set 默认使用 < 进行排序,编译器说的是 B::_l2 的类型有问题,A 不支持 < 排序,而 set 实例化的时候要求,所以失败。改成这样就好了。

class B{
public:
    set<A,std::greater<A>> _l2;
};

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧