C++ 如何在std::map中找到指定范围内的元素?

C++ 如何在std::map中找到指定范围内的元素?,c++,algorithm,search,stdmap,C++,Algorithm,Search,Stdmap,是否有与std::find(first,last)等效的版本,但对于std::map?也就是说,是否有一个版本的std::map的find方法可以搜索map中的元素,但只将搜索限制在指定的[第一、最后一个)范围内?理想情况下,解决方案应该是[第一、最后一个)大小的对数 从,std::map::find本身不支持此功能(它总是搜索整个地图).您可以使用std::lower_bound、std::upper_bound或std::equal_range,因为std::map迭代器和映射中的数据满足这

是否有与
std::find(first,last)
等效的版本,但对于
std::map
?也就是说,是否有一个版本的
std::map
find
方法可以搜索
map
中的元素,但只将搜索限制在指定的
[第一、最后一个)
范围内?理想情况下,解决方案应该是
[第一、最后一个)
大小的对数


从,
std::map::find
本身不支持此功能(它总是搜索整个地图).

您可以使用
std::lower_bound
std::upper_bound
std::equal_range
,因为
std::map
迭代器和映射中的数据满足这些函数的要求,尽管您应该知道它的效率低于
std::map::find()
由于线性迭代器增量

From
std::lower_bound

在第一个和最后一个之间的距离中,执行的比较数是对数的(最多为对数) 2(last-first)+O(1)比较)。但是,对于非LegacyRandomAccess迭代器,迭代器增量的数量是线性的


重点是我的。

如果我正确理解了这个问题,
std::map::lower\u bound
正是你要寻找的东西-它给你的元素不少于键。另一端也有
upper\u bound

可能是我遗漏了什么,但为什么
std::map::lower\u bound
没有出现呢根据您的喜好?您可能想澄清一下您的
std::find(v.begin(),v.end())
示例,不要调用
begin
end
,而应该是
std::find(subrange\u first,subrange\u last);
。您想要的是
O(log(distance(distance(distance(subrange\u first,subrange\u last))
而不是
O(log(size(map)))
O(距离(子范围,子范围,子范围,最后))
@Caleth我同意;这很混乱。我现在编辑它,试图让它更清楚。这并不能回答问题。搜索本身应限制在
[第一,最后)
(并且在
标准::距离(第一,最后)
中是对数),而不是返回的结果。
std::map::lower_bound
在这方面并不比
std::map::find
好。@MaxLanghof不,你错了。
std::find
将为你提供映射中的元素,而
lower_bound
只会为你提供不少于提供给lower_bound.Yo的元素你应该重新考虑你的否决票。因此它与带边界的
std::find
完全一样。
std::map::lower_bound
对搜索范围有限制。如果你想让你的答案是关于
std::lower_bound
(而不是
std::map::lower_bound
)的,那么请随意更改它(但斯拉瓦的答案已经涵盖了这一点)。@MaxLanghof这仍然比O(N)的最高票答案要好得多复杂性,因此性能方面这是OP所能期望的最好结果,而行为方面这正是他们所需要的。我支持我的答案。让我重新表述一下。我有一个包含1e20元素的映射。但我知道我要查找的元素位于前三个元素中。我如何告诉映射在没有(二进制)的情况下在这么小的范围内搜索我的元素搜索所有1e20?您的答案是
O(log(elements\u in\u map))
(comparations),而接受的答案是
O(length\u of\u range)
(迭代器增量)。不难看出有
length\u of\u range的情况