【问题标题】:C++ passing in string to mapC ++将字符串传递给映射
【发布时间】:2020-08-04 23:05:36
【问题描述】:

在下面的for 循环中,我测试查询中的字母是否在unordered_map<string, int> 中。如果不是,我打印一些东西。

queries = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ]
for (vector<string>& q : queries) {
    int start = index[q[0]], end = index[q[1]];
    if (index.find("z") == index.end()) {cout << "z" << '\n';
}

index 仅包含 a, b, c。对应的输出是这样的:

z z z z z

应该是这样,因为其中一个查询中有一个z。打印index 的大小为 3。

但是,如果我运行这个:

for (vector<string>& q : queries) {
    int start = index[q[0]], end = index[q[1]];
    if (index.find(q[0]) == index.end()) {cout << "z" << '\n';
}

我没有得到任何输出,但我希望有 x 的输出,因为它不在 index 中。

这是为什么?

【问题讨论】:

标签: c++ string unordered-map


【解决方案1】:

通过cppreferance中map的运算符[]的描述:

返回对映射到与 key 等效的键的值的引用,如果这样的键不存在,则执行插入。

index[q[0]] 创建了密钥 "x" 的条目。

【讨论】:

    【解决方案2】:

    如果未找到请求的键,std::(unordered_)mapoperator[] 会在映射中创建一个新条目。

    index 仅包含a, b, c

    在您的第一个示例中,如果 q[0]q[1] 永远不是 "z"index.find("z") 将返回 index.end(),这在您的示例中是正确的。

    但是,当您的循环结束时,index 将不会像您想象的那样仅包含 a, b, c。它实际上将包含a, b, c, e, x。当您使用 index[q[0]]index[q[1]] 的值初始化 startend 时,operator[] 会将 q[0]q[1] 的值插入到 index(如果它们不存在)。

    我没有得到任何输出,但我希望有 x 的输出,因为它不在 index 中。

    在您的第二个示例中,index.find(q[0])永远返回 index.end(),因为使用 index[q[0]]index[q[1]] 的值初始化 startendq[0]q[1] 中的每个值都被添加到 index 中。所以,添加q[0]的值,然后搜索q[0]的值总是会成功,永远不会返回index.end()

    所以是的,实际上ISindex 中有一个"x" 的条目,当循环到达queries 中的最后一个vector 时,包含"x" 字符串和operator[]将它们添加到index

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-27
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2023-03-15
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多