一年多没写过c++了,今天跳一坑里去了。
现象: map.insert(pair<int,boo>(x,true);最后结果总是 map[x] 为false
出错代码:
#include <map>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int arr[] = { 2, 4, 8, 4, 5, 3, 2 }; //测试数据
map<int, bool> ha;
for (int i = 0; i<sizeof(arr) / sizeof(int); ++i)
{
int key = arr[i];
if(ha[key])
printf("exists %d\n", arr[i]);
else
ha.insert(pair<int,bool>(key,true));
}
for (map<int, bool>::const_iterator itr = ha.begin(); itr != ha.end(); ++itr)
{
printf("%d=%d\n", (int)itr->first, (int)itr->second);
}
getchar();
return 0;
}
1、经过排查,发现问题在 if(ha[key]) 始终为false,可是我设置的值都是为true啊,这是为何呢?!
2、ha.insert(pair<int,bool>(key,true)); 替换为 ha[key]=true 后程序正确了。
经过以上两步,确定问题应该是 if(ha[key])语句时,map将key已经添加到ha中了,默认值为false,而insert时又不会更新值,最后导致insert无效,ha[key]始终为false。
纠正后代码为:
#include <map>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int arr[] = { 2, 4, 8, 4, 5, 3, 2 }; //测试数据
map<int, bool> ha;
for (int i = 0; i<sizeof(arr) / sizeof(int); ++i)
{
int key = arr[i];
if(ha.find(key)!=ha.end())
printf("exists %d\n", arr[i]);
else
ha.insert(pair<int,bool>(key,true));
}
for (map<int, bool>::const_iterator itr = ha.begin(); itr != ha.end(); ++itr)
{
printf("%d=%d\n", (int)itr->first, (int)itr->second);
}
getchar();
return 0;
}
经此一坑:
1、对map尽量用map[key]=value赋值,避免insert时的键存在时不报错问题。
2、要对这些基础库方法有明确的认识,理清方法具体含义。