28

定数 unordered_map からオブジェクトを読み取れないのはなぜですか?

const unordered_map<int, int> z;
int val = z[5]; // compile error

clang の下のエラーは次のとおりです。

error: no viable overloaded operator[] for type 'const
      unordered_map<int, int>'
                        int val = z[5];

a を使用した同等のコードが正常に機能することを考えると、const vectorなぜこの動作が発生するのか少し混乱しています。

4

2 に答える 2

37

z[5]は、マップの非 const メンバー関数を呼び出します。

これはoperator[]、キーが見つからない場合、マップが新しい要素を挿入するためです。そのため、明らかに定数ではない必要があります。

vectorによって何も挿入されない場合operator[]、その要素はすでに存在している必要があります (そうしないと、未定義の動作が発生するため、同等のコードで空のベクターの 6 番目の要素にアクセスすることになりますが、これは適切ではありません)。

キーを追加せずにルックアップするには、次を使用します。

int val = 0;
auto it = z.find(5);
if (it != z.end())
  val = it->second;
于 2012-11-13T01:36:00.960 に答える