【发布时间】:2020-02-19 15:20:02
【问题描述】:
所以我试图将 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 中,而我不能再这样做了。 p>
所以我正在寻求帮助以填充 kdnrMap 我已经尝试了几乎所有我现在能想到的东西。
【问题讨论】:
-
这里缺少很多代码。 minimal reproducible example 可能会让这个问题很容易解决。
-
Foo,Foo2;一个实际编译的最小示例。我们可能会从您的文字描述中挑出您的问题,但这不必要地复杂和模棱两可。只需编写一些简单的代码来演示您的问题。 -
请注意
operator[]相当昂贵,除非确实需要多次使用,否则最好只使用一次。您作为您的地图似乎拥有数据的所有权,您最好使用智能指针。 -
顺便说一句,为什么需要将内部地图存储为指针?只是为了让你的代码更复杂、更容易出错?
-
那么你不仅让它更复杂而且更慢,因为会涉及另一个不必要的间接。猜猜
std::unordered_map将其数据存储在哪里?
标签: c++ unordered-map