2011-02-03 12 views
0

オブジェクトの属性が入力引数と一致するstd :: list内の特定のオブジェクトを探したいとします。STLコンテナ内の特定のオブジェクトを見つける方法

find(。)またはfind_if(。)を使って単項述語を使って解を見つけましたが、私はバイナリ関数が必要です。

イテレータを(Javaのように)オブジェクトの参照にして、参照でフィールドをチェックできないのはなぜですか?検索/ find_ifを使用せずにいることを行う方法は...あり

+1

どのコンパイラを使用していますか?最近のGCCやVC版であれば、C++標準の次のバージョンのラムダ関数が実装されているので、これははるかに簡単です。 – sbi

答えて

8

私は、find(。)またはfind_if(。)を使って単項述語を使って解を見つけましたが、私はバイナリ関数が必要です。

ん - あなたは単項述語が必要なのですか- 結局、find_if機能は、オブジェクト(リスト内の現在のオブジェクト)と比較しません。あなたの述語がと比較する属性値をどの知っている必要があります:

struct compare_with { 
    int attr_value; 
    compare_with(int attr_value) : attr_value(attr_value) { } 

    bool operator()(your_object const& obj) const { return obj.attr == attr_value; } 
}; 

今、あなたはfind_ifを呼び出すことができます。

result = find_if(your_list.begin(), your_list.end(), compare_with(some_value)); 

なぜ私はちょうどイテレータは、オブジェクトの参照(ことを任せることはできませんJavaのように)参照を介してフィールドをチェック?

できます。しかし、これがあなたが何を意味するかは、はっきりとは分かりません。リストを反復するだけです。

2

はい、あなたはそれを行うことができます:あなたがバイナリ述語を必要とするだろう、なぜ

list<myclass>::iterator i; 
for(i = mylist.begin(); i != mylist.end(); ++i) 
{ 
    if(i->field == value_to_check_for) 
     break; 
} 

// now i is an iterator pointing to the object if it was found 
// or mylist.end() if it wasn't 

しかし

はもちろん、私は見ることができません一度に1つのオブジェクトをチェックしているだけの場合