2008-11-03 69 views
17

我想找到一個匹配對象的對象指針向量。這裏有一個示例代碼來說明我的問題:如何使用指向C++中的對象的向量的查找算法?

class A { 
public: 
    A(string a):_a(a) {} 
    bool operator==(const A& p) { 
     return p._a == _a; 
    } 

private: 
    string _a; 
}; 

vector<A*> va; 

va.push_back(new A("one")); 
va.push_back(new A("two")); 
va.push_back(new A("three")); 

find(va.begin(), va.end(), new A("two")); 

我想找到第二個項目推入向量。但是因爲vector被定義爲一個指針集合,所以C++不使用我的重載操作符,而是使用隱式指針比較。在這種情況下,首選的C++解決方案是什麼?

回答

17

使用find_if用函子:

template <typename T> 
struct pointer_values_equal 
{ 
    const T* to_find; 

    bool operator()(const T* other) const 
    { 
     return *to_find == *other; 
    } 
}; 


// usage: 
void test(const vector<A*>& va) 
{ 
    A* to_find = new A("two"); 
    pointer_values_equal<A> eq = { to_find }; 
    find_if(va.begin(), va.end(), eq); 
    // don't forget to delete A! 
} 

注:您的運營商==對於A應該是const,或者更好的是,它寫成一個非成員友元函數。

+0

我認爲它一定是find_if在代碼中? – esrkan 2008-11-03 15:21:52

4

要麼使用std :: find_if並自己提供一個合適的謂詞,請參閱其他答案以獲取此示例。

或作爲備選看看boost::ptr_vector,它提供了其真正存儲爲指針元素透明參考接入(作爲一個額外的獎金,內存管理爲您處理爲好)

1

您也可以使用Boost :: Lambda:

using namespace boost::lambda; 
find_if(va.begin(), va.end(), *_1 == A("two")); 

當然,您應該更喜歡使用shared_ptrs,因此您不必記得刪除!

相關問題