MSVC的unordered_map::lower_bound是什么?

3

我发现,与我的预期和文档相反,MSVC的std::unordered_mapstd::unordered_multimap(以及无序集合)提供了lower_boundupper_bound

这些成员函数是做什么用的?有没有相关的文档资料?

我在C++20模式下尝试了MSVC 2019和2022,以下代码似乎可以编译:

#include <iostream>
#include <unordered_map>
int main() {
    std::unordered_map<int, int> m;
    m.emplace(1, 1);
    std::cout << m.lower_bound(1)->first;
}
1个回答

3

这是一个为了兼容性而提供的非标准扩展。它已经被弃用,并具有以下警告:

hash_meow和unordered_meow容器的非标准lower_bound()成员是为了与有序关联容器接口兼容而提供的,不符合hash_meow或unordered_meow容器的语义。请改用find()成员。您可以定义_SILENCE_STDEXT_HASH_LOWER_BOUND_DEPRECATION_WARNING来抑制此警告。

来自yvals_core.h(upper_bound也有类似的警告)。

在使用/std:c++20时,您的代码实际上无法在VS 17.5上编译,因为我得到了上述“警告”(对我来说实际上是错误)。

至于它实际上是做什么,lower_bound相当于调用find;upper_bound稍微复杂一些,但仍然尝试使用_Find_last(内部MS函数用于哈希类型对象)找到键后面的下一个元素。


3
将那些“兼容性”函数添加进去是有史以来最愚蠢的想法。如果您无法遵守合同,请不要实现该功能。 - Mark Ransom
谢谢。使用简单的 /std:c++20 /Ox,我没有收到任何警告,而且在文档中也找不到任何信息。我是偶然发现了这些函数——我想在模板代码中区分有序映射和无序映射,使用“if constexpr(requires(MapType m) { m.lower_bound(1); })”,而我惊讶地发现unordered_map满足条件。 - Filip Konvička

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接