哈希映射元素的值不能正确打印

时间:2011-05-19 10:54:35

标签: c++ hashmap

我将一对(键,值)插入到我的hashmap中,但它似乎在尝试打印时没有值

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

让我们看一些代码:

.h

typedef hash_map<const string, string, strptrhash, strptrequal> StringHashMap;  
StringHashMap m_memberNameMap; 
typedef pair <const string,string> string_pair; 

的.cpp

void Powerdomain::addMemberName(const string& name){  

if (m_memberNameMap[name]==""){
    m_memberNameMap.insert(string_pair(name,name));
    StringHashMap::iterator it = m_memberNameMap.begin();
    cout << it->first << endl;
    cout << it->second << endl;
    cout << m_memberNameMap["MD1"] << endl;
}

名称=“MD1”输出:

MD1  
*blank*  
*blank*   

修改

关于艾伦的答案:

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;  

这不起作用。我现在可能会感到困惑!

3 个答案:

答案 0 :(得分:4)

这里有几个误解。首先,使用地图中的operator[],实际上插入一个新的(空)元素,其中包含密钥name。这个运算符的语义是,如果你访问地图中的一个元素,它必须在那里,所以如果它不存在,它就会被创建。然后,insert操作定义为以添加元素(如果已存在),因此这是您的问题。

你应该首先使用find:

if (m_memberNameMap.find(name) == m_memberNameMap.end()) // don't exist
{
   // rest of your code
}

答案 1 :(得分:4)

m_memberNameMap[name]条件if做了什么?如果映射中不存在键name,则会使用该键创建 new 插槽,并且值等于空字符串。

即表达式m_memberNameMap[name]调用operator[],如果密钥string_pair(name, "")不存在,则会向地图插入等于name的项目,

解决方案是使用find

if (m_memberNameMap.find(name) == m_memberNameMap.end())
{
    m_memberNameMap.insert(string_pair(name,name));
    //rest of the code...
}

您可以使用:

代替insert功能
   m_memberNameMap[name] = name; //simpler, cute!

毕竟,如果密钥不存在,operator[]会创建一个新的插槽。

答案 2 :(得分:1)

或者如果您想使用operator [],您可以保存其结果以确保只进行一次查找:

string & value = m_memberNameMap[name];
if (value.empty()) {
   value = name;
   // ...
}