【问题标题】:value of a hash map element not printing properly哈希映射元素的值未正确打印
【发布时间】:2011-05-19 10:54:34
【问题描述】:

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

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

让我们看一些代码:

.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;
}

name="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;  

这不起作用。我现在可能很困惑!

【问题讨论】:

    标签: c++ hashmap


    【解决方案1】:

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

    也就是说,表达式m_memberNameMap[name] 调用operator[],如果键name 不存在,则将等于string_pair(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[] 会创建一个新插槽。

    【讨论】:

    • 是的,我误解了 [] 做了什么。谢谢;) 如果地图中已经有某个键并且插入无效,是否有办法获得异常?因此我可以尝试捕获而不是 if ?
    • @djfoxmccloud:如果你愿意,你可以获得异常,但为此你必须编写自己的函数,在其中你必须再次使用find。那为什么要走这条路呢?为什么不使用if 而不是在您想使用您的功能的地方。此外,try-catch 并不比使用if 更好。避免它!
    • @Nawaz 所以你的意思是通常更好的做法是 //if (not here) {add it} else {throw exception} then a try catch ?
    • @djfoxmccloud:为什么要抛出异常?您可以将函数addMemberName的返回类型从void更改为bool,如果没有插入则返回false,如果插入则返回true
    • hm 我想抛出一个异常,因为我想要一个包含不同插入问题的报告文件。我的程序读取文件。假设文件 A 有一个名为 X 的成员,文件 B 有一个名为 X 的成员。我的读者将尝试在地图中添加两次 X,这是我想在输出日志文件中报告的内容。例外是一种不好的方法吗?
    【解决方案2】:

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

    你应该先使用 find:

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

    【讨论】:

    • 是的,我误解了 [] 做了什么。谢谢;)
    【解决方案3】:

    或者如果你想使用operator [],你可以只保存它的结果以确保只发生一次查找:

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

    【讨论】:

    • 如果我的地图类似于 typedef hash_map OtherHashMap myMap;那么 myMap[] 是 Other 的 ref 或对象或地址?
    • 这是对Other*的引用,即映射内的值。
    • 试试 ModuleType * & value = moduleTypeMap["type4"];
    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2022-01-25
    • 2014-11-30
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多