带有自定义类指针的矢量查找

Vector find with pointers of custom class

本文关键字:查找 指针 自定义      更新时间:2023-10-16

我试图了解在 STL(SCL) 中使用自定义类时需要重载的运算符。

任何人都可以告诉我我做错了什么吗?

class myClass
{
public:
    int data;
    myClass()
    {
        data =0;
        cout<<"Default const "<<endl;
    }
    myClass(int x)
    {
        data = x;
        cout<<"Int constructor"<<endl;
    }
    myClass(const myClass &m)
    {
        cout<<"Copy constructor"<<endl;
    }
    bool operator == (const myClass &temp)
    {
        cout<<"Operator called &";
        return data == temp.data;
    }
    bool operator == (const myClass *temp)
    {
        cout<<"Operator called *";
        return data == temp->data;
    }
};
int main ()
{
    /*
    vector<int> myvector;
    myvector.push_back(10);
    myvector.push_back(20);
    myvector.push_back(30);
    cout << "myvector contains:";
    for_each (myvector.begin(), myvector.end(), meObj);
    */
    vector<myClass*> myVec;
    myClass temp;
    myVec.push_back(&temp);
    myClass temp2(19);
    myVec.push_back(&temp2);
    myClass temp3(19);
    vector<myClass*>::iterator it = find(myVec.begin(),myVec.end(),&temp2); //works
    if(it!=myVec.end())
    {
        cout<<"Value is "<<(*it)->data;
    }
    vector<myClass*>::iterator dit = find(myVec.begin(),myVec.end(),&temp3); //fails
    if(dit!=myVec.end())
    {
        cout<<"Value is "<<(*dit)->data;
    } 
    cout << endl;
    return 0;
}

如果我错了,请纠正我,但第一个发现就像地址比较一样有效。我需要重载什么才能使上述工作?

两个签名有意义吗?

bool operator == (const myClass &temp); // seen in many places
bool operator == (const myClass *temp); // what if two pointer types of same object are being compared?

干杯!

运算符重载必须至少有一个用户定义类型。 因此,例如,您不能为两个指针重载operator==

您的myClass::operator==(const myClass *temp)在编译的意义上是有效的,但语义意义很小,因此不建议这样做(在极少数情况下,您希望执行T x; T *y; ... (x == y))。

对于您有指针向量的情况,您可能需要考虑 std::find_if ,它需要一个谓词。 像这样:

class CompareByPointer
{
public:
    explicit CompareByPointer(const myClass &p) : p(p) {}
    bool operator() (const myClass &rhs) const { return p->data == rhs->data; }
private:
    const myClass &p;
};
...
find_if(myVec.begin(), myVec.end(), CompareByPointer(&temp2));

[作为旁注,通常应尽可能const定义成员函数。 因此,您的操作员过载应该const

在示例代码中,您尚未将&temp3推送到myVec 中。因此,第二个std::find失败是有道理的。

在这种情况下,"工作"是什么意思? 通常,当您存储指针时,这是因为对象确实具有标识,比较地址是正确的做法。 否则,您可能应该存储值(尽管有例外)。 无论如何,您始终可以使用 find_if ,以及您想要的任何比较标准。 对于除了最简单的类型之外的任何东西,我发现自己使用find_if的频率都比find多;通常,您不是在寻找平等,而是在寻找某种特定类型的匹配。例如,在这里,您更可能需要以下内容:

std::vector<MyClass>::iterator it = std::find_if( myVect.begin(), myVect.end(),
                                                  boost::bind(&MyClass::id, _1, 19) );

(假设此处的data是某种标识符,并且您已经提供了一个成员函数,myClass::id()读取它。