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
。打印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_)map
的 operator[]
会在映射中创建一个新条目。
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]]
的值初始化 start
和 end
时,operator[]
会将 q[0]
和 q[1]
的值插入到 index
(如果它们不存在)。
我没有得到任何输出,但我希望有
x
的输出,因为它不在index
中。
在您的第二个示例中,index.find(q[0])
将永远返回 index.end()
,因为使用 index[q[0]]
和 index[q[1]]
的值初始化 start
和 end
。 q[0]
和 q[1]
中的每个值都被添加到 index
中。所以,添加q[0]
的值,然后搜索q[0]
的值总是会成功,永远不会返回index.end()
。
所以是的,实际上IS在index
中有一个"x"
的条目,当循环到达queries
中的最后一个vector
时,包含"x"
字符串和operator[]
将它们添加到index
。
【讨论】:
以上是关于C ++将字符串传递给映射的主要内容,如果未能解决你的问题,请参考以下文章