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
来简化。