2012-03-12 9 views
2

booleanを返す連想型の標準コンテナ(map、setなど)に 'find'関数がないのはなぜですか?連想型の標準コンテナには、より簡単な検索関数がありません

セイ:

std::map <int,int> mMap; 
... 
if (mMap.contains(75)) ... 

は、私は、find()について知っていると私はそれをこのよう

if (mMap.find(75) != mMap.end()) ... 

を行うことができますしかし、私はクラッタ何よりもコードより多くのそれを感じます。

これは単純な関数ではないのですが、なぜなら、コンテナはその中で物事を見つけ出すことを意味するのですか?

+1

、downvotesで問題ありませんが、なぜ教えてください。あなたは知っている、教育的価値なしの罰なし;-) – Valmond

+4

['std :: map :: count'](http://en.cppreference.com/w/cpp/container/map/count)は、あなたが望むことをするでしょう。 – KillianDS

+0

答えを出すには十分に近いです(あなたが投稿した場合、私はそれを受け入れます)! – Valmond

答えて

1

あなた自身作ることができます(注を、それが「HasKey」の価値観に対処するだろう「入って」ので)いつものように

template <class AssocContainer> 
bool HasKey(const AssocContainer& haystack, 
    const typename AssocContainer::key_type& needle) 
{ 
    return haystack.find(needle) != haystack.end(); 
} 

map<int, int> m; 
m[0] = 1; 
bool b = HasKey(m, 0); 
+0

はい、それは+1を動作させますが、それはあまりにも混乱します。 – Valmond

3

単純な理由の1つは、それが役に立たないということです(さらに非効率的になります)。

は、あなたが言うとき、それについてこのように考える:

mMap.find(75) 

あなたがたが何のために、75を探していますか?あなたは後でそれを使いたい!

なぜ、if (mMap.find(75) != mMap.end())と書いてから、もう一度75を見つけるのですか?

あなたが書くことができます。

std::map<int, int> mMap; 
std::map<int, int>::iterator whatIWant = mMap.find(75); 
if (whatIWant != mMap.end()) 
{ 
    int mapsTo = whatIWant->second; 
    ... 
} 

これは、あなたが一度findを発行することを意味しますが、両方containsの結果とマップ内の実際のノードを取得します。

+0

はい私はそれについて考えましたが、常にそうであるとは限りません。mMap [57] .foo = 1;を使用する前に値が存在するかどうかをチェックする必要があります。私は誤って新しいエントリを作成しません。ところで、コンパイラによって最適化されていないようなことは今のところ確かですか? – Valmond

+1

@Valmond - Shahbazが記述しているケースがあなたのリストです。式を 'whatIWant.second.foo = 1'に置き換えてください。これにより、冗長検索が回避されます。 –

+1

それがそこにあるかどうかを知りたいだけで、他には何もしたくないユースケースがたくさんあります。 – visitor

1

私は、find関数が2つの責任を持っていると考えています。この場合、同じコードを使用して2つの異なるものを見つけ出し、存在するかどうかチェックします。

関連する問題