[英]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.