2011-08-02 1 views
0

std::vector<std::pair<int, std::vector<int> > >というベクトルがあります。つまり、ベクトルとの対の対を含むベクトルです。 (私はマップで同じことを達成することができると知っていますが、それは私が求めているものではありません)ファンクタのc'torで値を検索

STLを使用してintを検索するにはどうすればよいですか?

struct FindFirst { 
    FindFirst(int i) : toFind(i) { } 
    int toFind; 
    bool operator() 
     (const std::pair<int, std::vector<int> > &p) { 
      return p.first==toFind; 
    } 
}; 

このように使用することができます:私は機能するソリューション書い

int valueToFind = 4; 
std::find_if(myVec.begin(), myVec.end(), FindFirst(valueToFind)); 

をしかし、それは少し醜いこのように私には見えます。より良い方法が必要です。 これはありますかより良いこれを行う方法なしC++ 0xまたはBoostから何かを使用していますか? (私はそれを行うための最善の方法を学ぶためにしようとしている、と私は強調しているので、唯一STL

EDIT:少し混乱は、私が求めているものにありますように が見えます。私が興味を持っているのは、特にSTL algoで使われているときに、ファンクタの検索値にコンストラクタを使うのは悪い習慣かどうかということです。

+0

申し訳ありませんが、私はこの質問を取り返すことができません:なぜこれのためのマップを使用していませんか? –

+0

私は前に同じ問題を複数の方法で見つけました。これは私がこのようなファンクタを必要とする瞬間に思いつくことができる最良の例です。 – Schnommus

+0

あなたが醜いことを見つけたら、あなたはC++を学び始めているだけです:) –

答えて

4

これは、STLのみを使用するときに行う最良の方法です。まさにあなたはそれについて好きではないですか(多分冗長でしょうか?)

std::binary_searchのような他のアルゴリズムで使用できるので、汎用性があります。

これはかなりシンプルで直接的です(少なくともC++のファンクタに慣れた人には)。

ここで本当に改善するのは、データ構造の選択だけです。そのようなユースケースはstd::mapでカバーされており、なぜ使用できないのか説明していません。実際の問題では地図が実際には適切ではないかもしれないが、その場合の例は実際の問題を代表するものではないことを理解しています。それを修正する必要があります。

+0

唯一のことは、 'bind2nd'などを使って検索演算子に検索値を渡す方法があると思ったのです。 – Schnommus

+0

@Schnommus:悲しいことに、そこにはありません。この欠点は、ラムダの導入によりC++ 0xで解決されました。 –

+0

それは私が探していた答えです - 私は ''の文書を見ていました。私は道があると確信していました。 – Schnommus

1

直接STLを使用していない理由は、(変数名;-)のため申し訳ありませんが)

void FindFirst(std::vector<std::pair<int, std::vector<int> > >& v, int intToLookFor) 
{ 
    std::vector<std::pair<int, std::vector<int> > >::iterator iItr; 
    for (iItr = v.begin(); iItr != v.end(); ++iItr) 
    { 
     if (iItr->first == intToLookFor) return; 
    } 
} 

を呼び出します。 また、この関数からの戻り値は、反復子またはベクトル値への参照になります。

+2

これは良い、正準のアプローチにするには、これはイテレータを使用して検索する範囲を指定する関数テンプレートでなければなりません。しかし、OPのアプローチの利点は、シーケンスが適切に順序づけられているならば、例えば 'std :: binary_search'のような他のアルゴリズムでも関数を使うことができるということです。 –

1

いいえ、述語関数にパラメータを渡すのは悪いことではありません。実際には、それによって述語が非常に柔軟になります。

代わりに、グローバル変数を使用することにします。これは、述語に使用するのが悪い方法です。

+0

もう一つの選択肢は、グローバルな 'bool演算子==(const std :: pair >&left、int right)'を定義することですが、IMHOではこれがOPのアプローチよりも改善されていません。 –