【问题标题】:Is std::advance on an iterator of std::multiset done in constant time?std::multiset 的迭代器上的 std::advance 是否在恒定时间内完成?
【发布时间】:2019-04-09 23:21:18
【问题描述】:

我想知道在 std::multiset 的迭代器上调用 std::advance 是否在恒定时间内完成。

【问题讨论】:

  • 这个问题没有显示自己努力寻找解决方案的迹象。只需查找 cppreference 就足够了。
  • 哦亲爱的@Walter,我只希望我能向您展示我的浏览历史。 cppreference 没有说明可以从 std::multiset 获得什么样的迭代器,因此,我不确定 std::advance 是否可以在恒定时间内完成。如果不对这里提出的问题的性质做出假设,那就太好了。你知道,我们大多数使用互联网的人(比如我)都不太精通 C++,并且正在努力学习。得到 -1 只会让我们更加沮丧。

标签: c++ stl iterator multiset


【解决方案1】:

不,只有随机访问迭代器可以在恒定时间内前进。否则,它是距离上的线性时间。

见:https://en.cppreference.com/w/cpp/iterator/advance

【讨论】:

  • 您能提供参考吗?
  • 当然,我添加了 cpp 参考链接。
  • 好吧,最坏的情况是线性的。从理论上讲,可以编写一个带有对数速度提前迭代器的多重集。但是,它会在其他操作中花费一些性能(不是破坏标准,只是一个常数因素),而且我不知道有任何 std 实现这样做。
  • 但是我怎么知道 std::multiset 是否返回一个随机访问迭代器呢? cppreference 页面只说 multiset 的“开始”方法只返回迭代器(没有提到哪种) - en.cppreference.com/w/cpp/container/multiset/begin
  • 正如您在en.cppreference.com/w/cpp/container/multiset 中的multiset 的成员中看到的,迭代器是双向的,而不是随机的。
【解决方案2】:

来自std::advance,我们看到了

复杂性

线性。但是,如果 InputIt 额外满足 RandomAccessIterator 的要求,复杂度是不变的。

由于std::*mapstd::*set 系列中的任何模板都不满足RandomAccessIterator 的要求,因此它是线性的。从例如here:

会员类型

[...]

iterator               常量双向迭代器
const_iterator    常量双向迭代器

【讨论】:

    猜你喜欢
    • 2021-06-01
    • 2010-12-12
    • 2021-08-18
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多