Установка unordered_map в качестве значения для unordered_map - PullRequest
2 голосов
/ 19 февраля 2020

Итак, я пытаюсь установить unordered_map как значение для другого unordered_map. Теперь у меня проблема в том, что я не могу поместить значения во второй unordered_map. Мой код выглядит следующим образом.

  std::string postCode;
  std::string[] postCodeSource = new std::string{1111,2222,3333,4444};
  std::unordered_map<std::string,unordered_map<int,Foo*>*> data;
  int k1=1234;//can be any number
  for(int i = 0; i < 4; i++){
    postCode = postCodeSource[i]
    if(data[postCode]==NULL) {
      data[postCode]=new std::unordered_map<int,Foo*>();
    }
    data[postCode]->at(int(k1)) = new Foo(postCodeSource[i]);
  }

классы:

class Foo{
  public:
  Foo();
  Foo(std::string postCode);
  std::string firstName,Customername,postCode;
}

Foo(std::string postCode); - это простой конструктор копирования.

Теперь, когда я достигаю data[lastPlz.getString()]->at(int(k1.customer)) = new Foo(&k1);, я получаю исключение вне диапазона от unordered_map, которое имеет смысл, поскольку в k1.customer еще нет объектов! Прежде чем я изменил код, я создал и заполнил указатель, похожий на этот.

std::unordered_map<int,Foo*> kdnrMap
kdnrMap[k1.customer] = new Foo(&k1);

и позже, я добавил kdnrMap к data . Это больше не будет работать так, как я задумал, поскольку для этого метода потребуется полностью заполненный kdnrMap , прежде чем я смогу добавить его в data , что я больше не могу делать.

Итак, я ищу помощи, чтобы заполнить kdnrMap . Я попробовал почти все, что мог придумать.

1 Ответ

2 голосов
/ 19 февраля 2020

Вам не нужно хранить внутреннюю карту как указатель. Просто пусть внешняя карта владеет внутренней, как это:

std::unordered_map<std::string,
   std::unordered_map<int, std::unique_ptr<Foo>>> data;
data[postCode][int(k1.Kundennr)] = new Foo(&k1);

Я не советую использовать здесь необработанные указатели, поскольку существует большой риск утечки памяти, если вы замените значение на внутренней карте. Использование std::unique_ptr упрощает работу с указателями.

Возможно, ваше исключение происходит потому, что unordered_map::at требует, чтобы значение содержало запрашиваемый вами ключ, чтобы получить ссылку на значение, которое оно это отображение. Если вместо этого использовать operator[], как в моем примере, карта создаст запись, если ключ не найден.

Если вы все еще настаиваете на том, чтобы значения внешней карты были указателями на внутреннюю карту, тогда Вы можете добавить элементы, как это:

std::unordered_map<int, Foo*> &inner = *data[postCode];
inner[int(k1.Kundennr)] = new Foo(&k1);

или

data[postCode]->operator[](int(k1.Kundennr)) = new Foo(&k1);
...