![](/img/trans.png)
[英]std::map::upper_bound vs std::upper_bound performance
[英]Is it possible to do an efficient and partial search of std::map via std::upper_bound?
我有一个std::map
和两个键key_small, key_big
我计算upper_bound
。 已知key_small <= key_big
。 这是我目前的做法:
#include <map>
#include <algorithm>
int main() {
// Some example data
std::map<int, char> data{{1, 'a'}, {2, 'b'}, {4, 'c'}, {5, 'd'}, {5, 'e'}};
int key_small = 1,
key_big = 3; // key_small <= key_big is always true
auto it_1 = data.upper_bound(key_big);
auto it_2 = data.upper_bound(key_small);
// Do something with it_1, then do something with it_2
}
我想以更有效的方式计算it_1
和it_2
。 上面it_2
的计算没有利用我已经计算it_1
的事实。 它第二次搜索整个map
。 我试图解决这个问题是做以下事情:
auto it_2 = (it_1 == data.end())
? data.upper_bound(key_small)
: std::upper_bound(data.begin(), std::next(it_1), key_small);
第二次调用似乎忽略了底层数据结构。 因此,它也是低效的。
有没有更好的计算it_2
的方法? 在我看来,使用log(std::distance(data.begin(), it_1)
比较应该可以找到第二个迭代器。在工作面试中有人告诉我这是可能的。
我不在乎该解决方案是否仅在 c++20 中可用。 我也接受特定于 libstdc++ 或 libc++ 的解决方案。 如果该解决方案也适用于find
,那就太好了。
是否可以通过 std::upper_bound 对 std::map 进行高效的部分搜索?
尽管std::upper_bound
可以与非随机访问迭代器一起使用,但它与那些迭代器具有线性复杂度。 所以,是的,可以这样做,但这种线性搜索是否有效取决于特定情况,在最坏的情况下,它会比两次std::map::upper_bound
查找慢。
如果distance(it_1, it_2) < log2(N)
,那么它可能更有效率。
有没有办法从两种计算 it_2 的方式中获益?
该接口不提供此类算法。 我认为没有任何算法可以比这两个查找渐近地更好地处理最坏情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.