C++ 相减映射迭代器

C++ 相减映射迭代器,c++,algorithm,dictionary,C++,Algorithm,Dictionary,我有一个程序,其中我有两个std::map迭代器,分别表示left和right。我要查找范围[左,右]中的元素数。 我天真地做了这样的事情:int len=right-left。我以为会很好,但是 然后我发现了distance(left,right)方法,这多亏了一个post-on-Stack溢出,但不幸的是它的时间复杂度是线性的 是否有可能获得此问题的O(1)解决方案 有可能得到一个O(1)解决方案吗 否。一个std::map有一个。双向运算符不支持随机访问,只能递增或递减。这意味着如果你想向

我有一个程序,其中我有两个
std::map
迭代器,分别表示
left
right
。我要查找范围
[左,右]中的元素数。

我天真地做了这样的事情:
int len=right-left
。我以为会很好,但是

然后我发现了
distance(left,right)
方法,这多亏了一个post-on-Stack溢出,但不幸的是它的时间复杂度是线性的

是否有可能获得此问题的
O(1)
解决方案

有可能得到一个O(1)解决方案吗


否。一个
std::map
有一个。双向运算符不支持随机访问,只能递增或递减。这意味着如果你想向前移动5个位置,你必须调用
++iterator\u name
5次。如果您需要随机访问,那么您需要选择一个支持这种访问的容器,如
std::array
std::vector

,您可以使用特定于编译器的
基于策略的数据结构。可以找到更多的细节,同样的也可以用于set。

Nope,
std::distance
是最好的选择。如果您真的需要一个
O(1)
解决方案,那么如果您想向前移动5个位置,您必须调用++迭代器\u name 5次。:或者使用@JeJo,这是它的一个抽象。我没有把它提出来,因为不管你做什么,这是一个O(N)手术。是的,当然。我的意思是,不用调用
++iter,++iter,…5次
,你可以通过
std::advance
来简化。