矢量查找自定义类的指针

时间:2011-05-23 15:23:06

标签: c++ stl vector

我正在尝试理解在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?

干杯!

3 个答案:

答案 0 :(得分:3)

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

你的myClass::operator==(const myClass *temp)在编译的意义上是有效的,但是它的语义意义很小,并且不推荐(很少有你想做T x; T *y; ... (x == y)的情况。)< / p>

对于您的情况,您有一个指针向量,您可能需要考虑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。]

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在这种情况下,“工作”是什么意思?通常,当您存储指针时,这是因为对象确实具有标识,并且比较地址是正确的事情。否则,您应该存储值(尽管有例外)。无论如何,您始终可以使用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()来阅读它。)