所以,我有这种情况需要查看对象是否在我的stl地图中。如果不是,我将添加它。
char symbolName[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
map<string,TheObject> theMap;
if (theMap.find(symbolName)==theMap.end()) {
TheObject theObject(symbolName);
theMap.insert(pair<string, TheObject>(symbolName,
theObject));
}
当对象不在地图中时,我在:theMap.find上获得核心转储。 据说,如果项目不在地图中,则应该返回一个iterator equivelent to map :: end
这里发生了什么?
海湾合作委员会:3.4.6答案 0 :(得分:4)
为什么不这样做呢?
char symbolName[] = "hello";
theMap.insert(pair<string, TheObject>(symbolName, TheObject(symbolName)));
如果您的地图是map<string, TheObject>
,那么如果您尝试搜索NULL,您将获得核心转储:
// This will core dump:
char *symbolName = NULL; // Oops!
theMap.find(symbolName); // Kabang!
答案 1 :(得分:4)
由于许多原因,它可能会崩溃。在不知道至少TheObject
的构造函数的定义的情况下,我认为我们很大程度上只能猜测这个问题。到目前为止,您的代码看起来很好,但可以简化:
char symbolName[] = "Hello";
map<string,TheObject> theMap;
theMap.insert(make_pair(symbolName, TheObject(symbolName)));
如果已经映射了符号,则不会执行任何操作,从而丢弃新的TheObject对象。
答案 2 :(得分:2)
在执行find()之前检查您的STL映射是否为空()。在空STL映射上执行find()时,某些STL实现会出错。
答案 3 :(得分:2)
顺便说一句,有两种可能的简化。
首先,使用make_pair
而不是pair
构造函数。这意味着您不必明确指定类型参数:
theMap.insert(make_pair(symbolName, theObject));
其次,您可以简单地写下代码而不是您的代码:
theMap[symbolName] = theObject;
答案 4 :(得分:2)
发布您的真实代码,或至少展示您所描述行为的完整示例。有时,当您尝试调试只是为了在这样的论坛中发布的伪装代码时,翻译中的问题是微妙的。
答案 5 :(得分:1)
答案 6 :(得分:1)
作为代码简化的补充:
使用std :: string而不是char [],并在TheObject的类定义中使用它。
不确定你的TheObject类使用char数组做了什么,但是如果你使用这个函数范围之外的map,例如。通过使用它作为返回值,我敢打赌,某处某个对象指向symbolName的地址,该地址已不再定义。
答案 7 :(得分:0)
我不知道你为什么得到核心转储;该代码适合我。
有机会使您的代码更简单,更易读:
正如其他人所说,您可以将插入简化为theMap[symbolName] = TheObject(symbolName)
我可能错了,但据我所知{'a','b','\ 0'}与“abc”相同,所以你可以简化到char symbolName[] = "Hello";
我我认为非惯用的定义会让一些人感到困惑。
答案 8 :(得分:0)
检查您是否在构造函数中使用它。在构造函数中使用map时遇到了类似的问题。
答案 9 :(得分:0)
我通过使用指向地图对象的指针修复了我的问题。由于在构造函数中使用,它们需要是指针,然后在构造函数中我新建它们。