Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 哈希映射元素的值未正确打印_C++_Hashmap - Fatal编程技术网

C++ 哈希映射元素的值未正确打印

C++ 哈希映射元素的值未正确打印,c++,hashmap,C++,Hashmap,我在hashmap中插入了一对(键、值),但在打印时它似乎没有值 问题是我不知道为什么我不能在下面的代码中打印第二个元素 让我们看一些代码: h 编辑 关于艾伦的回答: ModuleType * moduletype4=new ModuleType("type4"); ModuleType * value = moduleTypeMap["type4"]; if (value==NULL) { ModuleType& value2=*moduleTypeMap["type4"];

我在hashmap中插入了一对(键、值),但在打印时它似乎没有值

问题是我不知道为什么我不能在下面的代码中打印第二个元素

让我们看一些代码:

h

编辑

关于艾伦的回答:

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