map的关键字为类时,类的对象比较的函数为operator>时,怎么出错了?

时间:2021-09-21 15:39:03
//声明的类
class Array 
{
public:
Array(int num1,int num2,int num3);
bool operator >(const Array &A1)const;
int son, daughter, husband;
};
//类成员函数的实现
Array::Array(int num1,int num2,int num3)
{
son = num1; daughter = num2; husband = num3;
}

bool Array::operator >(const Array &A1)const
{
if(son>A1.son)  return true;
else            return false;
}
//此结构体作为map的value
struct pntInf 
{
int num1;
int num2;
int num3;
};

//声明map
map <Array, pntInf> mapS;


当类的运算符重载函数为<时,程序无错误,当类地运算符重载函数为>时,程序出错。
这是为什么

12 个解决方案

#1


该回复于2011-04-26 17:14:42被版主删除

#2


因为map、set排列是看 operator <

#3


书上说:map默认比较类型用less比较,所以如果你用默认的比较运算就要保证重载operator<;
当你用默认比较类型的时候,你又没有operator<,所以就错了。

#4


啥错?具体啥代码?
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。

#5




map <Array, pntInf> mapS;

写成

map<Array, pntInf, greater<Array> > mapS;

就OK了。

注意最后两个> >中间必须要有空格

#6


下面代码实现了LZ从大到小排序的意图,经验证可行:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
Array(int num1,int num2,int num3);
bool operator >(const Array &A1)const;
int son, daughter, husband;
};
//类成员函数的实现
Array::Array(int num1,int num2,int num3)
{
son = num1; 
daughter = num2; 
husband = num3;
}

bool Array::operator >(const Array &A1)const
{
if(son>A1.son) return true;
else return false;
}


//此结构体作为map的value
struct pntInf 
{
int num1;
int num2;
int num3;
};

int main(int argc, char* argv[])
{
map<Array, pntInf, greater<Array> > mapS;
pntInf pi1 = {1, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(1, 2, 3), pi1));
pntInf pi2 = {2, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(2, 2, 3), pi2));
pntInf pi3 = {3, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(3, 2, 3), pi3));
for(map<Array, pntInf, greater<Array> >::iterator it = mapS.begin(); it != mapS.end(); ++it)
{
cout << it->second.num1 << endl;
}
return 0;
}


map缺省地是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符。如果此时,没有重载“<”操作符,而是重载了“>”操作符自然就会报错。

如果用greater<Key>作为比较器,就必要重载Key类中的“>”操作符。

#7


map中的key要支持“<”

#8


引用 6 楼 pathuang68 的回复:
下面代码实现了LZ从大到小排序的意图,经验证可行:

C/C++ code

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
    Array(int num1,int num2,int ……


++

#9


那个类要支持 < 运算符
 
并且满足弱排序

#10


引用 9 楼 wwyyxx26 的回复:
那个类要支持 < 运算符
 
并且满足弱排序

只知其一、不知其二。

请看看6楼的代码和及其下面的说明。

#11


默认的是less排序,当然也可以自己定义greater排序,使用greater时为显式

#12


引用 6 楼 pathuang68 的回复:
下面代码实现了LZ从大到小排序的意图,经验证可行:
C/C++ code

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
    Array(int num1,int num2,int num3);
    b……


非常感谢,我现在明白了。刚才调试了一下,很不错。

#1


该回复于2011-04-26 17:14:42被版主删除

#2


因为map、set排列是看 operator <

#3


书上说:map默认比较类型用less比较,所以如果你用默认的比较运算就要保证重载operator<;
当你用默认比较类型的时候,你又没有operator<,所以就错了。

#4


啥错?具体啥代码?
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。

#5




map <Array, pntInf> mapS;

写成

map<Array, pntInf, greater<Array> > mapS;

就OK了。

注意最后两个> >中间必须要有空格

#6


下面代码实现了LZ从大到小排序的意图,经验证可行:

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
Array(int num1,int num2,int num3);
bool operator >(const Array &A1)const;
int son, daughter, husband;
};
//类成员函数的实现
Array::Array(int num1,int num2,int num3)
{
son = num1; 
daughter = num2; 
husband = num3;
}

bool Array::operator >(const Array &A1)const
{
if(son>A1.son) return true;
else return false;
}


//此结构体作为map的value
struct pntInf 
{
int num1;
int num2;
int num3;
};

int main(int argc, char* argv[])
{
map<Array, pntInf, greater<Array> > mapS;
pntInf pi1 = {1, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(1, 2, 3), pi1));
pntInf pi2 = {2, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(2, 2, 3), pi2));
pntInf pi3 = {3, 1, 1};
mapS.insert(pair<Array, pntInf>(Array(3, 2, 3), pi3));
for(map<Array, pntInf, greater<Array> >::iterator it = mapS.begin(); it != mapS.end(); ++it)
{
cout << it->second.num1 << endl;
}
return 0;
}


map缺省地是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符。如果此时,没有重载“<”操作符,而是重载了“>”操作符自然就会报错。

如果用greater<Key>作为比较器,就必要重载Key类中的“>”操作符。

#7


map中的key要支持“<”

#8


引用 6 楼 pathuang68 的回复:
下面代码实现了LZ从大到小排序的意图,经验证可行:

C/C++ code

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
    Array(int num1,int num2,int ……


++

#9


那个类要支持 < 运算符
 
并且满足弱排序

#10


引用 9 楼 wwyyxx26 的回复:
那个类要支持 < 运算符
 
并且满足弱排序

只知其一、不知其二。

请看看6楼的代码和及其下面的说明。

#11


默认的是less排序,当然也可以自己定义greater排序,使用greater时为显式

#12


引用 6 楼 pathuang68 的回复:
下面代码实现了LZ从大到小排序的意图,经验证可行:
C/C++ code

#include <iostream>
#include <string>
#include <map>

using namespace std;

class Comparer;
class Array 
{
public:
    Array(int num1,int num2,int num3);
    b……


非常感谢,我现在明白了。刚才调试了一下,很不错。