C ++将字符串传递给映射

Posted

技术标签:

【中文标题】C ++将字符串传递给映射【英文标题】:C++ passing in string to map 【发布时间】: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 中。

这是为什么?

【问题讨论】:

答案很快就会出现(来自某人),但请:创建minimal reproducible example,以便人们在未来更容易地帮助您。 【参考方案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

【讨论】:

以上是关于C ++将字符串传递给映射的主要内容,如果未能解决你的问题,请参考以下文章

可以将 Java 数组传递给采用数组的 C/C++ 函数吗?

通过指针或引用将映射传递给函数?

将c ++引用的地址传递给指针

将 Go 函数作为回调传递给 C

将多维数组传递给函数 C

C:将数组“即时”传递给函数