将 unordered_map 设置为 unordered_map 的值

Setting unordered_map as value for unordered_map

所以我试图将一个 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 我已经尝试了几乎所有我现在能想到的方法。

您真的不需要将内部映射存储为指针。就像这样让外部地图拥有内部地图:

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);