我发现,与我的预期和文档相反,MSVC 的
std::unordered_map
和 std::unordered_multimap
(以及无序集)提供 lower_bound
和 upper_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;
}
这是仅出于兼容性目的的非标准扩展。它已被弃用并有以下警告:
hash_meow 和 unordered_meow 容器的非标准 lower_bound() 成员被提供用于与有序关联容器的接口兼容性,并且与 hash_meow 或 unordered_meow 容器的语义不匹配。请改用 find() 成员。您可以定义 _SILENCE_STDEXT_HASH_LOWER_BOUND_DEPRECATION_WARNING 来抑制此警告。
来自 yvals_core.h(
upper_bound
有类似的警告)。
你的代码实际上没有为我编译,在 VS 17.5 上使用
/std:c++20
,因为我收到上面的“警告”(这对我来说实际上是一个错误)。
至于它实际做了什么,
lower_bound
和调用find
是一样的; upper_bound
有点复杂,但仍然尝试使用 _Find_last
(散列类型对象的内部 MS 函数)找到键后的下一个元素