0

コード:

    boost::unordered_map<int, boost::unordered_map<int, float>> map;
{
    boost::unordered_map<int, float> h;
    h.insert(make_pair(1, 0.5));
    map.insert(make_pair(5, h));
}
{
    boost::unordered_map<int, float> h = map[5];
    h.insert(make_pair(2, 0.6));
    map.insert(make_pair(5, h));
}
cout << map[5].size() << endl;

出力が 2 ではなく 1 になるのはなぜですか? そして、代わりに boost::unordered_map* > を使用すると、すべてがうまく機能します。誰でも私を助けることができますか?

4

1 に答える 1

0

コードの 2 番目のブロックで何が起こるかを次に示します。

  1. h = map[5]内部マップのコピーを作成します。
  2. h.insert(...)内部マップのコピーに値を追加します。
  3. map.insert(...)何もしません。 unordered_map::insert は、マップに同等のキーを持つ要素がない場合にのみ、要素をマップに挿入します。しかし、キー 5 はすでに存在するため、挿入は行われません。これは、挿入呼び出しからの戻り値のブール部分がfalseであることを確認することで確認できます。

ブロックの最後で、コピーされたマップは破棄され、単一の値を持つ元の内部マップが に残りmapます。その結果、map[5].size()==1の出力が得られます。

しかし、内部マップの値の型がポインターに設定されている場合、なぜ 2 の出力が得られるのboost::unordered_map<int, float>*でしょうか? コードの 2 番目のブロックはこれを行います。

  1. h = map[5]に挿入された内部マップへのポインターを取得しますmap
  2. h.insert(...)コピーではなく、内部マップに値を直接追加します。この時点で、すでにmap[5].size()==2です。
  3. map.insert(...)まだ何もしません。しかし、その必要はありません。内側のマップは既に変更されています。
于 2011-09-14T06:06:23.023 に答える