当使用自定义类声明std :: map时,如果我使用比较器而不是仅仅为类实现less运算符,那么会有什么区别吗?是一个错误的'还是认为不好?
这之间有任何区别:
std::map <MyClass, float, CompareMyClass> myMap2;
而且:
std::map <MyClass, float> myMap; // where MyClass has the less than operator implemented
完整代码:
class MyClass
{
public:
bool operator()(const MyClass& a, const MyClass& b) const
{
return a.value_ < b.value_;
}
bool operator<(const MyClass& myClass) const
{
return value_ < myClass.value_;
}
private:
friend struct CompareMyClass;
float value_;
};
struct CompareMyClass
{
bool operator()(const MyClass& a, const MyClass& b) const
{
return a.value_ < b.value_;
}
};
int main(int argv, char** args)
{
std::map <MyClass, float> myMap;
MyClass a;
myMap[a] = 1.99;
std::map <MyClass, float, CompareMyClass> myMap2;
MyClass b;
myMap[b] = 1.99;
system("PAUSE");
return 0;
}
答案 0 :(得分:0)
如果您提供operator<
,其行为应该不会令人惊讶。现在,对于不同的用途,您可能希望按照不同的标准对记录进行排序,对于这样的记录,任何operator<
都会有令人惊讶的行为。在这种情况下,最好创建一个比较器,其名称已经给出了如何排序的提示,因为它明确了地图(或其他东西)的排序方式。