2012-09-30 88 views
1

我在保留向量中的對象時遇到了一些麻煩,我想我需要對運算符進行一些操作。運算符==和向量混淆

std::vector<Foo> vec; 
Foo a = Foo(); 
vec.push_back(a); 

... 

if(std::find(vec.begin(), vec.end(), a) < vec.end()) { 
    // Found 
} else { 
    // Not found 
} 

美孚需要操作==編譯,我這樣做

bool Foo::operator==(const Foo& rhs) { 
    return this == &rhs; 
} 

但是從我個人理解,vec.push_back,將會使Foo對象的副本,所以我的==將返回假。

因此,每當我開始搜索時,它就永遠找不到。

這裏做什麼是正確的?我希望避免切換到指針向量。

+0

你會寫'operator ==()'處理Foo中的數據而不是指針? –

回答

2

更改Foo::operator==的實現以比較Foo的成員變量是否相等而不是檢查標識。例如:

bool Foo::operator==(const Foo& rhs) const { 
    return get_a() == rhs.get_a() 
     && get_b() == rhs.get_b(); // and so on 
} 

注意,這也可以是一個const功能,因爲它不應該修改任何成員變量和應在美孚的const場合下使用。

+0

這很有道理,謝謝 –

+0

如果它是const,那麼該運算符會更好。 –

+1

@BenjaminLindley答覆已更新。我原本只想做最小的改變,但這是一個很好的觀點。 – akton

1

確實沒有什麼可以做的,std :: vector <>(或者更確切地說是最標準的容器)在插入時創建副本。如果兩個Foo對象的相等性是通過地址相等來定義的,則唯一可以做的就是將指針存儲在std :: vector <>中。如果你想存儲指針std :: vector <>我建議存儲智能指針,而不是像std :: shared_ptr <>,std :: unique_ptr <>。

如果Foo的重量太大而無法複製,您可以在C++ 11中創建Foo Move-only,或者使用boost :: containers :: vector和boost :: move僅使其在C++ 03中移動。

也許只是改變運算符==()來比較成員變量而已。

+0

這一切都有道理,但OP不存儲指針。 – juanchopanza

1

你的operator==意味着身份是由它在內存中的位置定義的,但是你將值附加到一個向量並希望平等的事實表明身份不是由位置定義的。

如果由於某種原因你沒有基於任何其他成員的身份定義,你可以添加一個唯一的標識符,以您的富對象,可以在你的代碼比較該標識符:

bool operator==(const Foo &rhs) 
{ 
    return this->m_id == rhs.m_id; 
}