所以我尝试将一个 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/