2012-03-07 52 views
1

我遇到並且無法解決的問題就像這樣。我有兩類:通過其中一個值在向量中查找對象

class1 
{ 
private: 
    int identifier; 
    double value; 
public: 
    setters,getters,etc... 
} 
class2 
{ 
private: 
    vector<class1> objects; 
    vector<int> some_value; 
    vector<double> other_value; 
... 
} 

問題是我需要通過對象的矢量在第二類的一個目的是通過其標識符在Class對象搜索(從等級2的成員函數)。我想是這樣的:

int getObj(const int &ident, double &returnedValue, double &returnedOther_value) 
{ 
    int p; 
    p = find(objects.begin()->getIdentifier(),objects.end()->getIdentifier(),ident); 
    .. 

..然後我希望能找到一種方法,從來自這兩個類(非const)成員變量值和other_value的發現迭代值返回,但這樣的代碼遠遠不會編譯,因爲我可能做的搜索都是錯誤的。有沒有辦法可以用find(或其他算法)來做到這一點,還是應該堅持我以前的工作實現而不使用算法?

+0

添加了一個例子,您並不需要通過'int's爲const引用。它們是按值傳遞的(所以你不能改變原始值),並且在按值傳遞int時沒有開銷。 – MikMik 2012-03-07 11:15:55

回答

1

您需要將find_if與自定義謂詞一起使用。例如:

class HasIdentifier:public unary_function<class1, bool> 
{ 
public: 
    HasIdentifier(int id) : m_id(id) { } 
    bool operator()(const class1& c)const 
    { 
     return (c.getIdentifier() == m_id); 
    } 
private: 
    int m_id; 
}; 


// Then, to find it: 
vector<class1>::iterator itElem = find_if(objects.begin(), objects.end(), HasIdentifier(ident)); 

我還沒有測試過,所以也許它需要一些調整。

如果你有C11,我想你可以使用lambdas,但是我沒有它,所以我沒有機會去學習它們。

更新: 我在http://ideone.com/D1DWU

+0

這工作就像一個魅力!非常感謝。現在我所要做的就是弄清楚如何從類other 2中的other_value向量返回值,該值與對象向量中找到的值(通過索引)相對應。有沒有一種方法可以獲得我所問的內容,還有它在矢量中的索引?這將徹底解決我的問題。 – nutter 2012-03-08 15:51:29

+1

你可以像下面這樣從迭代器中找到一個元素的索引:'size_t index = it - v.begin();' – MikMik 2012-03-08 16:31:35

+0

謝謝。我從來不知道這是可能的。猜猜你每天都會學到新的東西。 :) – nutter 2012-03-08 20:39:29