C ++ vector std :: find()与自定义类的向量

时间:2014-04-22 22:05:24

标签: c++ vector find

为什么以下不起作用?:

MyClass *c = new MyClass();
std::vector<MyClass> myVector;
std::find(myVector.begin(), myVector.end(), *c)

这会带来错误。我不记得确切的错误,对不起,但它说像MyClass和const MyClass这样的东西无法通过运算符进行比较==

但是,如果我使用非类数据类型而不是&#34; MyClass&#34;做同样的事情,一切正常。 那么如何正确地使用类呢?

2 个答案:

答案 0 :(得分:7)

来自http://www.cplusplus.com/reference/algorithm/find/std::find的文档:

  

template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val);

在范围内查找值 返回比较等于val的范围[first,last]中第一个元素的迭代器。如果没有找到这样的元素,则该函数最后返回。

  

该函数使用operator==将各个元素与val进行比较。

编译器不会为类生成默认operator==。您必须对其进行定义,以便能够将std::find与包含您的类实例的容器一起使用。

class A
{
   int a;
};

class B
{
   bool operator==(const& rhs) const { return this->b == rhs.b;}
   int b;
};

void foo()
{
   std::vector<A> aList;
   A a;
   std::find(aList.begin(), aList.end(), a); // NOT OK. A::operator== does not exist.

   std::vector<B> bList;
   B b;
   std::find(bList.begin(), bList.end(), b); // OK. B::operator== exists.
}

答案 1 :(得分:0)

除非您重载了运算符==以提供此类函数,否则您无法比较自己类类型的两个对象。 std :: find()使用重载的运算符==来比较你默认提供的迭代器范围内的对象。