c++ - 将 unordered_map 设置为 unordered_map 的值

标签 c++ 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):

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添加到数据中。 这将不再按照我的预期方式工作,因为此方法需要完全填充的 kdnrMap 才能将其添加到 data 中,而我不能再这样做了。

所以我正在寻求帮助来填充 kdnrMap 我已经尝试了目前能想到的几乎所有方法。

最佳答案

您实际上并不需要将内部映射存储为指针。只需让外部 map 拥有内部 map ,如下所示:

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[] ,则如果未找到 key , map 将创建一个条目。

如果您仍然坚持将外部映射的值作为指向内部映射的指针,那么您可以添加如下元素:

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

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

关于c++ - 将 unordered_map 设置为 unordered_map 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60303584/

相关文章:

包含用户定义类型指针的 C++ vector

c++ - 何时检查项目是否已存在于 C++ 集合/映射中?

c++ - std::unordered_map::emplace 问题与私有(private)/删除的复制构造函数

c++ - 通过引用获取最后一个 vector 元素

c++ - 这个特定代码的时间复杂度是多少?

c++ - 避免 C++ 类中的内存泄漏

c++ - 调整大小后指向元素值的 unordered_map 指针是否有效?

c++ - 为什么 c++ 变量没有立即删除?

c++ - 如何查看接口(interface)是否启动

c++ - 在 gcc 编译器中使用 bts 汇编指令