2017-12-05 8 views
1

std::vector<MyString>のデータは一意ではありません。実際には、ほとんどの文字列が繰り返されます。そして私はユニークなものとそれらの繰り返し番号を見つけなければなりません。新しいstd :: mapエントリはキー挿入だけでどのように初期化されますか?

私はマップを使用する:

std::map<MyString,unsigned short> stringsMap; 
....... 
if (stringsMap.find(currentString) == stringsMap.end()) 
{ 
    stringsMap[ currentString ] = 0; 
} 

stringsMap[ currentString ]++; 
........ 

は、あなたはそれが少ないライン上で行うことができる方法のアイデアを持っていますか?

これは1行で行うことができます:stringsMap[ currentString ]++;デフォルトでは、短くは不確定値です。

+6

初期値は不定ではありませんでした。それは0です。['operator []'](http://en.cppreference.com/w/cpp/container/map/operator_at)value-missingキーの値を初期化します。 –

+0

あなたはそれについて何か確認していただけますか? –

+0

'if'文全体を取り除くだけです。 '[currentString]'がまだ存在していなければ、追加され、その値は0に初期化されてから、 'operator ++'がそれに適用されます。 –

答えて

3

これは1行で実行できます。stringsMap [currentString] ++;ただし、shortはデフォルトで不確定な値を持ちます。

これはdocumentationに記載の値が明確に定義され、真ではない:

挿入が行われた場合、マップされた値が、その値に初期化(デフォルト-構築クラスタイプの、ゼロでありますそれ以外の場合はで初期化されます)、その参照が返されます。

強調は私です。

だから、1つのライナーを書くことは完全に罰金です:

stringsMap[ currentString ]++; 

、これは一般的な方法であるとさえドキュメントの例として与えられた:

// count the number of occurrences of each word 
// (the first call to operator[] initialized the counter with zero) 
std::map<std::string, size_t> word_map; 
for (const auto &w : { "this", "sentence", "is", "not", "a", "sentence", 
         "this", "sentence", "is", "a", "hoax"}) { 
    ++word_map[w]; 
} 
1

しかし短いが不確定値を持っていますデフォルトではマップが有効unsigned shortため0に評価新しく作成されたエントリの値を初期化するためにT()が使用されない既存のキーについて

号。

std::map::operator[] documentation(強調鉱山)を参照してください:キーが存在しない場合

1)value_type(key, T())を挿入します。この機能は、return insert(std::make_pair(key, T())).first->second;
- key_typeの要件がCopyConstructibleの要件を満たしている必要があります。
- mapped_typeは、CopyConstructibleDefaultConstructibleの要件を満たしている必要があります。
挿入が実行されると、マップされた値が値で初期化されます(クラスタイプの場合はデフォルトで構築されます。ゼロ初期化の場合は)、その参照が返されます。

したがって、単に

std::map<MyString,unsigned short> stringsMap; 
....... 
stringsMap[ currentString ]++; 

を書くことは完全に罰金です。 ifブロック全体が冗長であり、必要ありません。本当に真実ではない


1)は、それが@Remy Lebauの重点

関連する問題