2017-08-03 4 views
1

C++でIDictionary.ContainsKey(TKey)またはList.Contains(T)を使用していますか?C++のアナログのContainsKey(TKey)がC#のものです - ベストプラクティスは何ですか?

たとえば、私は要素の配列を持っており、この配列に何らかの値があるかどうかを知る必要がありますか? 各要素に「foreach」を付けずに、最良の方法または最良の方法を教えてください。 例えばstd libraryのようなものであれば良いでしょう。

UPD 1: - ...

Lookindをより良いdesigionstd::unordered_setされていることをあまり複雑でように速く、少しコード、STD libに多くのコンテナがありますが、私は最善の方法を見つけたいですthis logic

#include <unordered_set> 

    std::unordered_set<std::string> NamesOfValues = { 
    "one", 
    "two", 
    "Date", 
    "Time" 
    }; 

    // and now check is value exists in set 
    if(NamesOfValues.count(value)) 
    { 
     // value exists 
    } 
+1

std :: map(特にfind()関数)を見てみることができます:http://www.cplusplus.com/reference/map/map/find/ –

+0

私は見ています - しかし、より良いdesigionを持っている可能性があります - 例えば、std :: map :: countはもっと良く見えます... – Alexander

+0

[マップにキーの値が含まれているかどうかを確認できますか?](https://stackoverflow.com/questions/3136520) /決定するかどうかのマップは、キーのための値を含む) –

答えて

3

countを使用するのが最も簡潔に思えますが、これはどのコンテナでも有効です。私たちはあなたの元の辞書の種類に最も近い程度[unordered_]map[unordered_]setを、話している場合

if (my_map.count(key)) { // shorthand for `count(key) != 0` 
    // It exists 
} else { 
    // It does not 
} 

は、その後、これらのコンテナは、一意キーを施行するため、返される .count()0または 1することができ、心配する必要はありませんどちらかと言えばコンテナの残りの部分を無意識に繰り返します(重複をサポートするコンテナで発生するように)

いずれにしても、暗黙的にboolに変換すると、最も簡潔なコードになります。そして、あなたがキーごとに異なるカウントを許す/必要とするかもしれないデザインを持ったら、特定の値と比較することができます。

+0

(my_map.count(key)> 0)の方が良いかもしれませんか? – Alexander

+1

私はなぜそれが表示されません。 'map'も' set'も指定されたキーの2つ以上の要素を含むことはできません。したがって、結果は0または1のいずれかになります。しかし、あなたが '> 0'を書くという意味を好むなら、確かに、自由に感じてください。私は、コードを後で別のタイプのコンテナに転送しやすくするかもしれないと思う。 –

+0

ああ - はい、そうですよ! – Alexander

3

に行けばあなたはstd::findを探しています。 Findは、任意のイテラブルへの任意の型入力を探し、その要素にイテレータを返します。標準マップの

std::unordered_map<char,int> my_map = { {'a', 1},{'b', 2}}; 

auto found_element = std::find(my_map.begin(), my_map.end(), 'a'); 
if(found_element == my_map.end()){ 
    //nothing was found 
} 
else{ 
    // do something 
} 

あなたはまた、代わりにO(n)は(1)アクセスO用map.find(T)あります

はたとえば、次の操作を行うことができ、辞書内の要素を検索します。

if(my_map.find('a') != my_map.end()){ 
    //something was found! 
} 
else{ 
    //nothing was found 
} 

これはあなただけあなたが実際にあなたが持っているどのように多くの要素を理解しようとしていた場合、あなたは非ユニークキーを使用していた場合に使用することになり... my_map.count()よりも明らかです。

+1

ほとんど - しかし、これは "大きなコード"を与える、私は短く、より良いdesigionを探しています.. – Alexander

+0

@アレクサンダー "ビッグコード"とは何を意味するのですか?私が知る限りこれを行う標準的な方法は他にありません。 – snb

+0

@Alexanderこれのようなコードをブール関数でラップしてから、パラメータを渡すことができます。あなたは.containsKey(...のようなものを持つことができるようにそのように)trueまたはfalseを返します –

関連する問題