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()
由于线性迭代器增量
Fromstd::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的情况