3

私たちが持っていると仮定しましょう

map<int, int> count;

操作の安全性 (プラットフォームに依存、コンパイラの問題)count[x]++;count[x] += value;xおよびvalueが整数である場所。

私が観察したい動作は次のとおりです。

  • キーが存在しない場合は、の実行後にcount[x]++;intcount[x]=1 0 に初期化する必要があります。これはプラットフォームによって異なります。
  • 存在する場合、演算子は期待どおりに動作する必要があります。つまり、値をインクリメントします。

参考までに、ここに同様の問題に関する質問がありますが、プラットフォーム依存/コンパイラ依存の部分には答えていません。

言い換えれば、count[x]++;常にcount[x] += value;機能します。

4

3 に答える 3

11

キーが存在しない場合、count[x]++; の実行後、count[x]=1、つまり int を 0 に初期化する必要があります。これはプラットフォームによって異なります。

いいえ、変わりません。値はvalue-initializedになります。したがって、型が などの基本型である場合は、intに初期化され0ます。これは、C++11 標準のパラグラフ 23.4.4.3/1 で指定されています。

T& operator[](const key_type& x);

1効果: マップに相当するキーがない場合x、マップに挿入value_type(x, T())します。

値の初期化に対応するという事実T()は、段落 8.5/17 で指定されています。

初期化子のセマンティクスは次のとおりです。[...]

[...]

初期化子が の場合()、オブジェクトは value-initializedです。

[...]

最後に、パラグラフ 8.5/8 に従って:

タイプのオブジェクトを値で初期化Tするとは、次のことを意味します。

Tデフォルトのコンストラクター (12.1) がないか、ユーザー提供または削除されたデフォルトのコンストラクターのいずれかを持たない (おそらく cv 修飾された) クラス型 (第 9 節) である場合、オブジェクトはデフォルトで初期化されます。

Tが (おそらく cv 修飾された) 非共用体クラス型であり、ユーザー提供または削除された既定のコンストラクターがない場合、オブジェクトはゼロで初期化Tされ、自明でない既定のコンストラクターがある場合は既定で初期化されます。

Tが配列型の場合、各要素は値で初期化されます。

それ以外の場合、オブジェクトはゼロで初期化されます

次の問題:

存在する場合、演算子は期待どおりに動作する必要があります。つまり、値をインクリメントします。

はい(もちろんモジュロ演算子のオーバーロード)。

于 2013-05-30T14:18:45.663 に答える
2

マップ内の整数およびその他のプリミティブ C++ 型は、存在しない場合はゼロに初期化されます。他の型は、その型のデフォルトのコンストラクターで初期化されます (もちろん、デフォルトのコンストラクターが適切に機能しない場合、興味深い結果が得られる可能性があります...)

しかし、基本的な C++ 型を想定すればcount[x]++問題ありません。

于 2013-05-30T14:18:28.573 に答える
1

count[x]++キーxが存在しない場所で実行するmapと、新しいインスタンスがデフォルトで構築され、マップに配置され、参照が返されます。

ここでの値はintであり、makeのようintにデフォルトで構築されているため、常に期待どおりに動作します。0int()

于 2013-05-30T14:19:27.610 に答える