【问题标题】:Subtracting map iterators减去映射迭代器
【发布时间】:2023-03-31 01:21:01
【问题描述】:

我有一个程序,其中有两个 std::map 迭代器,分别表示 leftright。我想找到[left,right].范围内的元素个数

我天真地做了这样的事情:int len = right - left。我认为它会很好,但它gave me an error

然后我发现 distance(left, right) 方法感谢 Stack Overflow 上的帖子,但不幸的是它具有线性时间复杂度。

是否有可能为此获得O(1) 解决方案?

【问题讨论】:

  • 不,std::distance 是最好的选择。如果您确实需要O(1) 解决方案,请尝试boost::flatmap

标签: c++ algorithm dictionary


【解决方案1】:

您可以使用特定于编译器的policy based data structure。更多详情可以查看on this codeforces postset也可以使用。

【讨论】:

    【解决方案2】:

    是否有可能为此获得 O(1) 解决方案?

    没有。 std::map 有一个 BidirectionalIteratorBidirectionalIterator 不支持随机访问,只能递增或递减。这意味着如果你想向前移动 5 个位置,你必须调用 ++iterator_name 5 次。如果你需要随机访问,那么你需要选择一个支持它的容器,比如 std::arraystd::vector

    【讨论】:

    • 如果你想向前移动 5 个位置,你必须调用 ++iterator_name 5 次。:或者可能使用 std::advance(iterator, 5)
    • @JeJo 这是一个抽象。不管你做什么助手,我都没有提出来,这是一个 O(N) 操作。
    • 是的,当然。我的意思是不用调用++iter, ++iter,...5 times,可以简化为std::advance
    猜你喜欢
    • 2021-04-15
    • 2011-07-31
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    相关资源
    最近更新 更多