如何在std::vector中查找对象

how find an object in std::vector

本文关键字:查找 对象 vector std      更新时间:2023-10-16

我有一个像下面这样的对象

 class MyClass{
   int a;
   double b;
 };

 vector<MyClass> vMyClass;

然后我想在vMyClass中搜索,尝试使用算法函数:

 if( std::find(vMyClass.begin(), vMyClass.end(), aiField) == vMyClass.end())

我还定义了operator==

 int operator ==(Field &Left,Field &Right)
 {
    return memcmp(&Left,&Right,sizeof(Field));
 }

int operator ==(Field &Right)
{
    return memcmp(this,&Right,sizeof(Field));
}

但我收到一条错误消息。

1>c:Program Files (x86)Microsoft Visual Studio 9.0VCincludealgorithm(40) : error C2678: binary '==' : no operator found which takes a left-hand operand of type 'MyClass' (or there is no acceptable conversion)
1>        C:Program FilesMicrosoft SDKsWindowsv6.0Aincludeguiddef.h(192): could be 'int operator ==(const GUID &,const GUID &)' [found using argument-dependent lookup]
1>        c:usersshmueliandocumentsvisual studio 2008projectssrcexamplesDLgeneratorDLParser.h(85): or       'int operator ==(MyClass &,MyClass &)' [found using argument-dependent lookup]
1>        c:usersshmueliandocumentsvisual studio 2008projectssrcexamplesDLgeneratorDLParser.h(70): or       'int MyClass::operator ==(MyClass &)'
1>        while trying to match the argument list '(MyClass, const MyClass)'
1>        c:Program Files (x86)Microsoft Visual Studio 9.0VCincludealgorithm(74) : see reference to function template instantiation '_InIt std::_Find<std::_Vector_iterator<_Ty,_Alloc>,_Ty>(_InIt,_InIt,const _Ty &)' being compiled
1>        with
1>        [
1>            _InIt=std::_Vector_iterator<MyClass,std::allocator<MyClass>>,
1>            _Ty=MyClass,
1>            _Alloc=std::allocator<MyClass>
1>        ]
1>        c:usersshmueliandocumentsvisual studio 2008projectssrcexamplesDLgeneratorDLParser.h(108) : see reference to function template instantiation '_InIt std::find<std::_Vector_iterator<_Ty,_Alloc>,MyClass>(_InIt,_InIt,const _Ty &)' being compiled
1>        with
1>        [
1>            _InIt=std::_Vector_iterator<MyClass,std::allocator<MyClass>>,
1>            _Ty=MyClass,
1>            _Alloc=std::allocator<MyClass>
1>        ]
1>CommandArgParser.cpp
1>Generating Code...

它们需要是常量引用。而memcmp真的非常糟糕——只需进行成员比较即可。

您忘记了==运算符中的const限定符,而且它应该返回bool,而不是int。只需使用这个:

bool operator ==(const Field &Left, const Field &Right)
{
    return (Left.a == Right.a) && (Left.b == Right.b);
}

您有一个MyClass的向量,但有一个用于Field的比较运算符。你必须写一个
bool operator == (const MyClass &, const MyClass &)

此运算符应该(如其他运算符所示)不使用memcmp,而是执行成员比较。

在类本身中实现运算符:

class MyClass
{    
public:
    int a;    
    double b;  
    bool operator ==(const MyClass &Right) const
    {      
        return (a == Right.a) && (b == Right.b);  // 'this' is left
    } 
};