如何检查地图中是否存在匹配?

时间:2016-06-13 07:58:57

标签: c++ dictionary stl

我想知道是否已经分配了匹配的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;
}

5 个答案:

答案 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)

使用map::find并检查它是否不等于map::end

答案 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';
}