提问人:bobah 提问时间:11/23/2016 最后编辑:Communitybobah 更新时间:2/4/2023 访问量:638
为什么没有透明的C++ std::map::at?
Why no transparent C++1x std::map::at?
答:
我的猜测是,这一定是 .提供 的透明版本对查询键类型施加了额外的要求 - 如果查询键不在映射中,则必须插入它(使用默认构造值),这意味着必须可从查询键类型构造。std::map::at()
std::map::operator[]()
std::map::operator[]()
std::map::key_type
K
std::map::key_type
评论
find
find
find
P2363 建议为 、 、 、 和 (后者用于无序映射)添加异构密钥重载。它错过了包含在 C++23 中,并且在 C++26 中被标记为待处理。at
try_emplace
insert_or_assign
operator[]
insert
bucket
可以在 Github 上找到对 P2363 进行的评论摘要。对不起,我不知道如何找到原始评论;它甚至可能不公开。
在该评论摘要中,有以下评论:
目前,对于异构查找,唯一键关联容器不要求最多有一个匹配项......
我认为这篇论文应该讨论在这种情况下会发生什么,特别是对于insert_or_assign、运算符[]和在(以及try_emplace失败时会返回什么)
我相信该注释回答了为什么没有为 C++14 或 C++17 提供异质重载。at()
我的结论(与T.C.在另一个答案中的评论不谋而合):
std::map
的异构查找目前不要求最多有一个匹配项。对于该函数,此类查找必须:at()
- 被限制为 0..1 个匹配项,或者,
- 访问满足键等效性条件的第一个元素(如果未找到,则抛出)。
对于行为应该是什么可能没有达成共识,这可能就是为什么在 C++14 和 C++17 中引入异构键的提案中被排除在外的原因。或者,也许他们认为这在语义上只对访问一个没有歧义的独特元素有意义(这就是多地图中没有的原因)。at()
at
at
请注意,在编译时无法检查异构密钥是否最多匹配一个元素。
作为参考,这是为 C++14 引入异构键的提案:N3657 向关联容器添加异构比较查找。其中没有提到。at()
这是在 C++20 中引入无序容器异构查找的提案:P0919 无序容器的异构查找。
这是引入异构密钥进行擦除的提案:P2077 关联容器的异构擦除重载,标记为已批准用于 C++23。
评论
operator[]
find
find
Key