挿入せずにstd :: mapにキーが含まれているかどうかを確認する方法


回答:


305

を使用しmy_map.count( key )ます。0または1のみを返すことができます。これは、基本的に必要なブール結果です。

交互にmy_map.find( key ) != my_map.end()動作します。


40
@ジョン:時期尚早の最適化のその悪臭。GCC(と私は、最も合理的なシステムだと確信しています)では、map::countとして実装されていfind(__x) == end() ? 0 : 1;ます。以下のためにmultimapパフォーマンスの引数を持っているかもしれないが、それはOPの質問ではないと私はまだ優雅さを好みます。
Potatoswatter

42
いいえ、時期尚早の最適化引数は、最適化に何らかの努力が必要な場合にのみ有効です。
markh44

13
違います。コードを読みやすくしたり、不要なオーバーヘッドを排除したりするのは時期尚早ではありません。この場合、とにかくcount()がfind()を介して実装されている場合、find()を呼び出すと、関数呼び出しが直接排除されます...エルゴ、それは成熟した最適化です。また、find()呼び出しを使用する方がわかりやすいと思いますが、これは純粋に個人的な好みです。
Tim Keating 2013

9
ライブラリ関数を使用する前にライブラリ関数のパフォーマンスを把握することは、時期尚早な最適化ではありません。この場合、あなたは正しいです、それは問題ではありませんが、findとcountの微妙なスタイルの違いも同様です。私はあなたが「時期尚早の最適化」のレトリックをあまりにも遠くに持っていると思います。見つけて日常の開発に使用できる「無料」の最適化の習慣を身に付けるべきです。読みやすさ/開発時間などのコストを支払うという罠にプログラマーが屈服したとき、時期尚早の「パフォーマンスの向上」が原因で、時期尚早の最適化レトリックが適切なアドバイスになります。
VoidStar 2014

10
はるか遠くに、stdは地球上の他のすべての正気なマップクラスと同様に、いまいましいhas(k)/を追加するだけcontains(k)です。貧弱なインターフェース設計。find()アプローチは冗長すぎて、このcount(k)アプローチはと意味的に同等ではありませんhas(k)。その点ではどちらもありませんfind(k)。この質問の視聴回数を確認してください。
ジャロッドスミス

46

Potatoswatterの答えは大丈夫ですが、私はfindまたはlower_bound代わりに使用することを好みます。lower_bound同じキーで何かを挿入したい場合は、返された反復子を後でヒント挿入に使用できるため、特に便利です。

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

これは、彼が言っていることとは微妙に異なります...唯一の違いは、value挿入が不要な場合、の計算がスキップされることです。
Potatoswatter

1
確かに、私はOPが挿入を気にしないことを理解しているので、lower_boundベースのソリューションはやりすぎです。私は「完全を期すために」私の答えにちょっと触れました。私が言ったように、あなたは完全に十分です。:-)
Chris Jester-Young

4
はい、これは良い答えであり、私は何も反対しません。insertアプリオリの代替案との関係を指摘するだけです。実際にはmultimaplower_boundメソッドを使用すると同等の範囲の先頭に挿入されるのに対し、プレーンinsertメソッドは範囲の末尾に追加されるのとは別の違いがあります。
Potatoswatter 2010年

2
質問に対する答えではありませんが、ここでの正しい答えに導く私の貧しい質問は...挿入/更新を行う必要があります。:D
Hunter-Orionnoir 2015

1
@ハンターコードを見せてくれませんか?それが大規模でない場合、私はおそらくあなたのためにそれを確認できます。
Chris Jester-Young

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.