使用地图比较器时的行为差异

时间:2015-04-19 05:31:20

标签: c++ c++-standard-library

当使用自定义类声明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;
}

1 个答案:

答案 0 :(得分:0)

如果您提供operator<,其行为应该不会令人惊讶。现在,对于不同的用途,您可能希望按照不同的标准对记录进行排序,对于这样的记录,任何operator<都会有令人惊讶的行为。在这种情况下,最好创建一个比较器,其名称已经给出了如何排序的提示,因为它明确了地图(或其他东西)的排序方式。