我想知道是否已经分配了匹配的m1[0]
。我以这种方式尝试并打印" 1",这似乎是正确的。这是正确的方法吗?还是更好的解决方案?
int main(int argc, char const *argv[]){
map<int, char> m1;
//cout << m1[0] << endl;
if(m1[0] == NULL) cout << "1" << endl;
else cout << "0" << endl;
}
答案 0 :(得分:3)
您没有检查密钥是否存在,您只是检查映射到密钥的值是否为NULL
(即'\0'
为char
)
您应该使用std::map::find
:
auto it = m1.find(0);
if (it != m1.end()) std::cout << "0: " << it->second << "\n";
else cout << "Not found." << endl;
请注意,如果密钥不存在,std::map::operator[]
将插入value_type
对象。在这种情况下,该值将为value-initialized,对于char
,它将被初始化为零,即'\0'
。因此m1[0]
首先会进行插入,然后m1[0] == NULL
将返回true
,这就是为什么您的代码看起来是正确的。
答案 1 :(得分:2)
使用m1.find(key)
,如果没有结果,它将返回m1.end()
。
此外,您可以使用m1.at(key)
代替m1[key]
,如果没有此类元素,则会引发std::out_of_range
例外。
答案 2 :(得分:1)
答案 3 :(得分:1)
正如其他人所说,使用map :: find或map :: at来检查元素是否存在。我只是想提一下(但我还不能评论),如果不存在,[]运算符会添加给定的元素,因此你不能将它用于检查,因为它会修改你的地图。
答案 4 :(得分:1)
这是不正确的:如果地图中尚未显示0
,那么您的代码会将其添加为值0
。由于0
等于NULL
,这意味着您的代码正在测试地图是否将值0
分配给密钥0
。它没有测试密钥0
是否已经在地图中。
要测试地图中是否存在密钥,请使用count()
功能。如果密钥存在,则返回1
,否则返回0
。
int main(int argc, char const *argv[]) {
map<int, char> m1;
count << (m1.count(0) ? "0" : "1") << '\n';
}