C++ 哈希映射元素的值未正确打印
我在hashmap中插入了一对(键、值),但在打印时它似乎没有值 问题是我不知道为什么我不能在下面的代码中打印第二个元素 让我们看一些代码: h 编辑 关于艾伦的回答:C++ 哈希映射元素的值未正确打印,c++,hashmap,C++,Hashmap,我在hashmap中插入了一对(键、值),但在打印时它似乎没有值 问题是我不知道为什么我不能在下面的代码中打印第二个元素 让我们看一些代码: h 编辑 关于艾伦的回答: ModuleType * moduletype4=new ModuleType("type4"); ModuleType * value = moduleTypeMap["type4"]; if (value==NULL) { ModuleType& value2=*moduleTypeMap["type4"];
ModuleType * moduletype4=new ModuleType("type4");
ModuleType * value = moduleTypeMap["type4"];
if (value==NULL) {
ModuleType& value2=*moduleTypeMap["type4"];
value2=*moduletype4;
cout << "correctly inserted" << endl;
}
cout << moduleTypeMap["type4"]->getName() << endl;
ModuleType*ModuleType=new ModuleType(“类型4”);
ModuleType*值=ModuleType映射[“类型4”];
如果(值==NULL){
ModuleType&value2=*moduleTypeMap[“类型4”];
value2=*模块化PE4;
cout这里有几个误解。首先,在地图中使用操作符[]
,实际上将插入一个新的(空的)带有键name
的元素。此运算符的语义是,如果访问地图中的元素,它必须在那里,因此如果它不存在,则创建它。然后,将插入操作定义为不,如果元素已经存在,则添加该元素,这就是您的问题
您应该先使用“查找”:
if (m_memberNameMap.find(name) == m_memberNameMap.end()) // don't exist
{
// rest of your code
}
这里有几个误解。首先,在地图中使用操作符[]
,实际上将插入一个新的(空的)带有键name
的元素。此运算符的语义是,如果访问地图中的元素,它必须在那里,因此如果它不存在,则创建它。然后,将插入操作定义为不,如果元素已经存在,则添加该元素,这就是您的问题
您应该先使用“查找”:
if (m_memberNameMap.find(name) == m_memberNameMap.end()) // don't exist
{
// rest of your code
}
m_memberNameMap[name]
在if
条件下做什么?如果键name
在映射中不存在,它将使用该键创建一个新的插槽,其值等于空字符串
也就是说,表达式m_memberNameMap[name]
调用operator[]
,如果键name
不存在,它会在映射中插入一个等于string\u pair(name,”)
的项
解决方案是使用find
作为:
if (m_memberNameMap.find(name) == m_memberNameMap.end())
{
m_memberNameMap.insert(string_pair(name,name));
//rest of the code...
}
除了插入功能,您还可以使用:
m_memberNameMap[name] = name; //simpler, cute!
毕竟,操作符[]
如果键不存在,会创建一个新的插槽。如果条件不存在,那么m\u memberNameMap[name]
会做什么?如果键name
在映射中不存在,它会使用该键创建一个新插槽,并且值等于空字符串
也就是说,表达式m_memberNameMap[name]
调用operator[]
,如果键name
不存在,它会在映射中插入一个等于string\u pair(name,”)
的项
解决方案是使用find
作为:
if (m_memberNameMap.find(name) == m_memberNameMap.end())
{
m_memberNameMap.insert(string_pair(name,name));
//rest of the code...
}
除了插入功能,您还可以使用:
m_memberNameMap[name] = name; //simpler, cute!
毕竟,operator[]
在密钥不存在的情况下会创建一个新插槽。或者如果要使用operator[]
,只需保存其结果,以确保只进行一次查找:
string & value = m_memberNameMap[name];
if (value.empty()) {
value = name;
// ...
}
或者,如果要使用运算符[]
,只需保存其结果以确保只进行一次查找:
string & value = m_memberNameMap[name];
if (value.empty()) {
value = name;
// ...
}
是的,我误解了什么是的。谢谢;)如果地图中已经有某个键,并且插入无效,有没有办法获得异常?因此我可以做一个try-catch而不是if?@djfoxmccloud:如果你想得到异常,你可以得到异常,但为此你必须编写自己的函数,在其中你必须再次使用查找。那么为什么要这样做呢是吗?为什么不在你想使用函数的地方使用if
。另外,try-catch并不比使用if
好。避免它!@Nawaz所以你是说通常最好做一些类似//if(不在这里){addit}else{throw exception}的事情然后是一个try catch?@djfoxmccloud:为什么要抛出异常?您可以将函数addMemberName
的返回类型从void
更改为bool
,如果未插入值,则返回false
,如果插入值,则返回true
!嗯,我想抛出异常,因为我想包含不同插入问题的报告文件。我的程序读取文件。假设文件a有一个名为X的成员,文件B有一个名为X的成员。我的读取器将尝试在映射中添加X两次,这是我想在输出日志文件中报告的内容。异常是一种不好的方法吗?是的,我误解了[]是的。谢谢;)如果地图中已经有某个键,并且插入无效,有没有办法获得异常?因此我可以做一个try-catch而不是if?@djfoxmccloud:如果你想得到异常,你可以得到异常,但为此你必须编写自己的函数,在其中你必须再次使用查找。那么为什么要这样做呢是吗?为什么不在你想使用函数的地方使用if
。另外,try-catch并不比使用if
好。避免它!@Nawaz所以你是说通常最好做一些类似//if(不在这里){addit}else{throw exception}的事情然后是一个try catch?@djfoxmccloud:为什么要抛出异常?您可以将函数addMemberName
的返回类型从void
更改为bool
,如果未插入值,则返回false
,如果插入值,则返回true
!嗯,我想抛出异常,因为我想包含不同插入问题的报告文件。我的程序读取文件。假设文件a有一个名为X的成员,文件B有一个名为X的成员。我的读取器将尝试在映射中添加X两次,这是我想在输出日志文件中报告的内容。异常是一种不好的方法吗?是的,我误解了[]是的。谢谢;)是的,我误解了[]所做的。谢谢;)如果我的映射类似于typedef hash_map OtherHashMap myMap;那么myMap[]是一个ref或Other的对象或地址?它是对Other*的引用,即映射内的一个值。请尝试ModuleType