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
#2
因为map、set排列是看 operator <
#3
书上说:map默认比较类型用less比较,所以如果你用默认的比较运算就要保证重载operator<;
当你用默认比较类型的时候,你又没有operator<,所以就错了。
当你用默认比较类型的时候,你又没有operator<,所以就错了。
#4
啥错?具体啥代码?
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。
#5
把
写成
就OK了。
注意最后两个> >中间必须要有空格
map <Array, pntInf> mapS;
写成
map<Array, pntInf, greater<Array> > mapS;
就OK了。
注意最后两个> >中间必须要有空格
#6
下面代码实现了LZ从大到小排序的意图,经验证可行:
map缺省地是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符。如果此时,没有重载“<”操作符,而是重载了“>”操作符自然就会报错。
如果用greater<Key>作为比较器,就必要重载Key类中的“>”操作符。
#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
++
#9
那个类要支持 < 运算符
并且满足弱排序
并且满足弱排序
#10
只知其一、不知其二。
请看看6楼的代码和及其下面的说明。
#11
默认的是less排序,当然也可以自己定义greater排序,使用greater时为显式
#12
非常感谢,我现在明白了。刚才调试了一下,很不错。
#1
#2
因为map、set排列是看 operator <
#3
书上说:map默认比较类型用less比较,所以如果你用默认的比较运算就要保证重载operator<;
当你用默认比较类型的时候,你又没有operator<,所以就错了。
当你用默认比较类型的时候,你又没有operator<,所以就错了。
#4
啥错?具体啥代码?
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。
难道要打哑谜来猜么。楼主,不如先google “提问的智慧”认真学学吧。
#5
把
写成
就OK了。
注意最后两个> >中间必须要有空格
map <Array, pntInf> mapS;
写成
map<Array, pntInf, greater<Array> > mapS;
就OK了。
注意最后两个> >中间必须要有空格
#6
下面代码实现了LZ从大到小排序的意图,经验证可行:
map缺省地是用less<Key>作为比较器,所以它要求作为Key的类要重载“<”操作符。如果此时,没有重载“<”操作符,而是重载了“>”操作符自然就会报错。
如果用greater<Key>作为比较器,就必要重载Key类中的“>”操作符。
#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
++
#9
那个类要支持 < 运算符
并且满足弱排序
并且满足弱排序
#10
只知其一、不知其二。
请看看6楼的代码和及其下面的说明。
#11
默认的是less排序,当然也可以自己定义greater排序,使用greater时为显式
#12
非常感谢,我现在明白了。刚才调试了一下,很不错。