我将一对(键,值)插入到我的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;
这不起作用。我现在可能会感到困惑!
答案 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;
// ...
}