簡體   English   中英

向量查找與自定義類的指針

[英]Vector find with pointers of custom class

我試圖了解在使用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()來讀取它。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM