2009-07-17 10 views
2

find()関数の使用中にエラーが発生しました。ここでは、コードは次のとおりです。find()の問題

#include <iostream> 
#include <map> 

#define N 100000 

using namespace std; 

int main (int argc, char * const argv[]) { 

    map<int,int> m; 

    for (int i=0; i<N; i++) m[i]=i; 

    find(m.begin(), m.end(), 5); 

    return 0; 
} 

私はcompillerエラーを取得しています: 'アルゴリズム' 何も変更を含む

error: no match for 'operator==' in '__first. __gnu_debug::_Safe_iterator<_Iterator, _Sequence>::operator* [with _Iterator = std::_Rb_tree_iterator<std::pair<const int, int> >, _Sequence = __gnu_debug_def::map<int, int, std::less<int>, std::allocator<std::pair<const int, int> > >]() == __val' 

を。 VS2008でコンパイルすると同様のエラーが表示されます。

私はm.find()について知っていますが、実際にはfind()も使用する必要があります。

ありがとうございました!

P.S.実際には、m.find(5)とfind(m.begin()、m.end()、5)の速度を比較することで、両者を適切に動作させる必要があります。

+0

ベクターなどのよりシンプルなコンテナと比較するとよいでしょうか? –

+0

メンバー関数の代わりにstd :: findが必要な_why_と言うことができますか?メンバ関数ははるかに高速です。 – rlbond

答えて

8

begin()end()それらのコレクションの要素へのアクセスを提供します。これらの要素のタイプは、コンテナのvalue_typeとして知られています。 std::map<Key, Value>の場合、value_typestd::pair<Key, Value>です。したがって、find関数は、pair<int, int>が5になるようにしようとしています。pair<int, int>intを比較すると、operator==が定義されていないため、エラーが発生します。

(限り、あなたがメンバーfind()を避けたいと)これを行うための正しい方法はstd::find_ifを使用することです:

template <class First> 
struct first_equal 
{ 
    const First value; 

    first_equal(const First& value) 
     : value(value) 
    { 
    } 

    template <class Second> 
    bool operator() (const std::pair<First, Second>& pair) const 
    { 
     return pair.first == value; 
    } 
}; 

... 

find_if(m.begin(), m.end(), first_equal<int>(5)); 

また、あなたはやりたいpairためoperator==intを過負荷になる可能性があり、それはです(あなたのコードにすべて影響を与え、そのような比較が一般的に意味を持たないため)非常にハッキリです。

+0

ありがとう、パベル!私にとって非常に便利なコードサンプル。 –

3

find()には、* iteratorと比較できるパラメータが必要です。マップの場合、これはペア< int、int>になります。ペアを比較するには、ダミーペアと比較ファンクタを作成する必要があります。すべてのSTLコンテナの

+0

'std :: pair'は要素が同じであれば比較できます。 –

+0

これは知っておきたいことです。あなたは通常あなたが探しているペアの半分を知らないので、それは一般的に有用ではありませんが、このケースではカスタム比較ファンクタなしで使用できるかもしれません。 –

+0

Upped - spot on。 –

2

だけm.findを使用(5)

+0

質問は特にメンバーのfind()の使用を避けるように頼んでいます –

関連する問題