Вложенный boost :: unordered_map не обновляет значение? - PullRequest
0 голосов
/ 13 сентября 2011

Код:

    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;

Почему вывод равен 1, а не 2? И когда я вместо этого использую boost :: unordered_map *>, тогда все работает хорошо. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 14 сентября 2011

Вот что происходит во втором блоке кода:

  1. h = map[5] создает копию внутренней карты.
  2. h.insert(...) добавляетзначение для копии внутренней карты.
  3. map.insert(...) ничего не делает. unordered_map :: insert вставляет элемент на карту тогда и только тогда, когда на карте нет элемента с эквивалентным ключом .Но ключ 5 уже присутствует, и поэтому вставка не происходит.Вы можете подтвердить это, проверив, что логическая часть возвращаемого значения из вызова insert равна false .

В конце блокаскопированная карта отбрасывается, а исходная внутренняя карта с одним значением остается в map.В результате вы получите вывод map [5] .size () == 1 .

Но почему мы получаем вывод 2, если тип значения внутренней картыустановлен указатель, boost::unordered_map<int, float>*?Второй блок кода будет делать это:

  1. h = map[5] получит указатель на внутреннюю карту, вставленную в map.
  2. h.insert(...) добавляет значение к внутреннейкарта напрямую - не в копию.На данный момент map [5] .size () == 2 уже.
  3. map.insert(...) по-прежнему ничего не делает.Но в этом нет необходимости - внутренняя карта уже была изменена на месте.
...