2012-03-07 6 views
1

私が遭遇した問題は解決できませんでした。ベクトルのonオブジェクトをその値の1つで検索する

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

問題は、私は(クラス2のメンバ関数から)クラス1のオブジェクトにその識別子により第二のクラスのオブジェクト内のオブジェクトのベクトルを検索する必要がある:私は、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を値渡しする際のオーバーヘッドはありません。 – MikMik

答えて

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を持っていれば、ラムダを使うことができますが、私はそれを持っていないので、それらを学ぶ機会はありませんでした。

UPDATE: 私はあなたがconst参照として `int`sを渡す必要はありませんhttp://ideone.com/D1DWU

+0

これは魅力的に機能しました!どうもありがとうございます。今度は、クラス2のother_valueベクトルから値を返す方法を見つけ出すだけです。これはオブジェクトベクトルで見つかったもの(インデックスによる)に相当します。私が尋ねたことだけでなく、ベクトルのインデックスも得ることができる方法はありますか?それは私の問題をきれいに解決するだろう。 – nutter

+1

要素のインデックスは、次のようにイテレータからベクトル内にあります。 'size_t index = it - v.begin();' – MikMik

+0

ありがとう。私はこれが可能であることを知らなかった。あなたは毎日何か新しいことを学ぶと思います。 :) – nutter

関連する問題