为什么重载operator<()不能实现比较功能?

Kar*_*ath 1 c++

我正在看这个。作者首先operator<()在my_data中定义并表示“一切正常”。添加成员变量后,他说“operator<()并没有真正实现比较操作”。我想知道两者有什么区别,为什么前者是错误的?


struct my_data
{
    std::string key;
    std::string value;
    //first
    bool operator<(const my_data data)const {           
        return key < data.key;
    }
};
//second
struct Compare
{
    bool operator()(const my_data& l, const my_data& r)
        const {
        return l.key < r.key;
    }
};
Run Code Online (Sandbox Code Playgroud)

从那里

Nat*_*ica 7

和

struct my_data
{
    std::string key;
    std::string value;
    //first
    bool operator<(const my_data data)const {           
        return key < data.key;
    }
};

std::set<my_data> data;
Run Code Online (Sandbox Code Playgroud)

您可以将类与 a 一起使用std::set,但您operator <没有使用所有对象,它只是比较单个字段。这就是视频作者所抱怨的。他们认为它只比较对象的一个​​字段,而不是对象的整个状态。通过切换到

struct my_data
{
    std::string key;
    std::string value;
};

struct Compare
{
    bool operator()(const my_data& l, const my_data& r)
        const {
        return l.key < r.key;
    }
};

std::set<my_data, Compare> data;
Run Code Online (Sandbox Code Playgroud)

不再是“说谎” operator <,而是一个自定义比较器,可以只比较您想要的内容。

  • @TRPh——你是对的,他们做的事情完全相同。问题不在于他们**做什么**,而在于**他们宣布**他们做什么。争论的焦点是,**命名**这种比较“operator&lt;”具有误导性,因为说一个“my_data”对象“小于”另一个“my_data”对象并没有任何意义。因此,作者不使用“operator&lt;”,而是更喜欢“Compare”,因为它没有“&lt;”所具有的含义;他可以说“这个‘set’对象**将**元素与‘Compare’进行比较”。 (2认同)