是否需要将“==”运算符定义为使用std :: find

时间:2010-05-08 14:15:27

标签: c++ stl

让我说我有:

class myClass
std::list<myClass> myList

其中myClass没有定义==运算符,只包含公共字段。

在VS2010和VS2005中,以下内容无法编译:

myClass myClassVal = myList.front();
std::find( myList.begin(), myList.end(), myClassVal )

抱怨缺少==运算符。

我天真地认为它会对myClass对象的公共成员进行值比较,但我几乎肯定这是不正确的。

我假设如果我定义一个==运算符或者使用仿函数代替它,它将解决问题。

或者,如果我的列表中包含指针而不是值,那么比较就可以了。

这是对的还是我应该做别的事?

3 个答案:

答案 0 :(得分:7)

编译器不会自动生成默认的operator==(),因此如果您自己不编写,则无法比较您的类的对象是否相等。

如果你想在公共成员上进行成员比较,你必须自己实现为operator==()(或“手动”使用单独的函数/仿函数进行比较)。

答案 1 :(得分:5)

查找确实需要值为equality comparable,编译器不会为您定义默认值operator==

或者,您可以使用find_if并提供仿函数谓词。

答案 2 :(得分:3)

std::find需要operator==。即使成员是公开的,也不一定意味着所有成员都与定义平等对于这个阶级意味着什么相关。

如果由于某种原因不想重载运算符(例如,对于该类没有单一的直观含义,在某些方面可以认为实例相等),您可以编写合适的函数对象并使用std::find_if。例如:

struct same_surname_as
{
    Person p;
    same_surname_as(const Person& x): p(x) {}
    bool operator()(const Person& person) const { return p.surname == person.surname; }
};

list<Person> li;
find(li.begin(), li.end(), same_surname_as(Person("Pu Songling"));