2009-07-22 12 views

答えて

17
  1. これは、マップ上で動作んが、キータイプ、(std::pair<const map::key_type, map::mapped_type>です)map::value_typeと比較する必要はありません。
  2. map.findはキーを受け取り、キーと値のペアの反復子を返します。
+1

を使用することができるはず単純型の場合は、マップの 'VALUE_TYPE_は' 'ペアです。 –

+2

標準セクション23.3.1によると、std :: map では、key_typeはKeyですが、value_typeはpair です。その理由は、値が挿入されると挿入の鍵は不変でなければならない、そうでなければ順序の不変量が壊れる可能性があるからです。 –

3

他のところで指摘したように、動作しますが、タイプはキーと値のペアなので、比較を行うために関数/関数を指定する必要があります。 (カスタム演算子==()でオーバーロードすることもできますが、私はそのようなことを試みたことはありません)

おそらくマップメンバー関数find O(logN)ルックアップ、アルゴリズムstd :: find()はO(N)です。

追加:私はあなたもOK(これらはO(LogN)でもOK)マップでstd :: equal_range/lower_bound/upper_bound()を使うことができると思います。

+0

カスタム演算子==は許可も必要もありません。 find_if innsteadを使用してください。 – MSalters

+0

あなたは大丈夫です。 –

1

equal_rangeですか?マップでは、lower_bound、upper_bound、equal_rangeのメンバー関数を使用する必要があります。同等のstdは対数の比較を提供するかもしれませんが、コンテナの要素を歩くためには線形時間が必要です。

+0

リニアウォークは本当ですか?私はあなたがランダムアクセスイテレータを持っていれば、ログウォークをうまくいくと思った。 –

+0

ランダムアクセスイテレータがある場合はそうですが、そうでない場合は、リニアなステップ数を実行する必要があります。 std :: mapはランダムアクセスイテレータを提供しません。 – navigator

+0

これは間違いありません。マップのイテレーターは双方向です。 –

1

これらのようなテーマについては、Scott Meyersの「Effective STL」をお読みください。

「項目43:同じ名前を持つアルゴリズムのメンバ関数を優先」メンバ関数が存在し、なぜあなたはそれを使うべき理由について

0

Scott Meyersは、独自のループを記述するのではなく、STLアルゴリズムを使用することも推奨しています(2001年版のItem 43)。あなただけ明確にするだけで

find(mmap.begin(), mmap.end(), "value") 
関連する問題