【问题标题】:How to use std::find() with vector of custom class?如何将 std::find() 与自定义类的向量一起使用?
【发布时间】:2014-04-22 22:05:23
【问题描述】:

为什么以下方法不起作用?:

MyClass c{};
std::vector<MyClass> myVector;
std::find(myVector.begin(), myVector.end(), c);

这会报错。

错误:“operator==”不匹配(操作数类型为“MyClass”和“const MyClass”)

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

【问题讨论】:

    标签: c++ vector find


    【解决方案1】:

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

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

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

    该函数使用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.
    }
    

    【讨论】:

      【解决方案2】:

      除非您重载了 operator== 以提供这样的功能,否则您无法比较您自己的类类型的两个对象。 std::find() 使用您的重载 operator== 来比较您默认提供的迭代器范围内的对象。

      【讨论】:

      • @CaptainObvlious: operator== 永远不会为类类型隐式定义/自动生成..
      • 如果隐式定义它会很好,至少对于 POD。缺少它意味着使用 memset-memcmp 来比较结构很诱人。
      • 糟糕。出于某种原因,我认为这是一个复制赋值运算符
      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多