【问题标题】:How to check the existence of a matching in map?如何检查地图中是否存在匹配?
【发布时间】:2016-06-13 07:58:56
【问题描述】:

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

【问题讨论】:

标签: c++ dictionary stl


【解决方案1】:

您不是在检查密钥是否存在,您只是在检查映射到密钥的值是否为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,这就是您的代码似乎正确的原因。

【讨论】:

    【解决方案2】:

    使用m1.find(key),如果没有结果会返回m1.end()

    此外,您可以使用m1.at(key) 代替m1[key],如果没有这样的元素,它会抛出std::out_of_range 异常。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        正如其他所说,使用 map::find 或 map::at 来检查元素是否存在。我只是想提一下(但我还不能评论)[] 运算符会在给定元素不存在时添加它,因此您不能将其用于检查,因为它会修改您的地图。

        【讨论】:

          【解决方案5】:

          这是不正确的:如果 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';
          }
          

          【讨论】:

            猜你喜欢
            • 2021-09-12
            • 1970-01-01
            • 2015-02-15
            • 2019-11-18
            • 1970-01-01
            • 2018-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多