【问题标题】:adapter to convert any iterator to random access iterator将任何迭代器转换为随机访问迭代器的适配器
【发布时间】:2015-02-18 01:04:39
【问题描述】:

我有任何不提供随机访问迭代器的容器,目标是创建一个适配器,接收此类迭代器的输入并为容器提供随机访问迭代器接口。

我不确定如何使用 boost::iterator_facade,因为它有点令人困惑:-/ 有一些堆栈溢出示例,但我不确定如何使用它们 (here)

任何链接/示例都可能会有所帮助。 (我阅读了boost 中的示例,考虑到我在boost 的经验,它们有点难以消化

【问题讨论】:

  • 标准要求迭代器上的所有操作都需要摊销的常数时间。您不能将花费O(N) 时间的迭代器递增N,并神奇地将其转换为花费O(1) 时间的迭代器来做同样的事情。结果不会满足随机访问迭代器的复杂性要求。
  • 使用std::advance 能解决你的问题吗?
  • 同意,我确实了解迭代器和容器的设计和概念......但是即使性能最差也可以实现。如果是这样,我只想自己实现它,但我只需要任何想法/开始。谢谢!
  • 只需要随机访问的迭代器范围(begin_it、end_it)。即使性能很差,底层实现也可以是任何东西。我不是在修改容器,只需要一个随机访问包装器。

标签: c++ boost boost-iterators


【解决方案1】:

你不想这样做。

要么

  • 使用具有功能的通用范围库进行“动态”缓存,例如 Eric Niebler 的 Container Ranges concept from his Ranges proposal
  • 明确编码意图,例如通过为您的函数创建一个标签分派的重载,将输入范围“具体化”到一个用于随机访问算法的临时容器中

如果您真的坚持,是的,您可能可以实现您的想法,但除了隐藏运行时/存储成本之外,我看不出它有什么好处。尤其是,需要保持生命周期并非易事。¹


稍微相关:Boost Spirit 有一个 boost::spirit::multi_pass 适配器,但只能从 InputIterator 升级到 ForwardIterator(以允许回溯)。

¹(当你有一个已经是随机访问范围的临时文件时你会怎么做?你不能保留对它的引用,但你也不应该不必要地复制它。)

【讨论】:

  • 这在 STL 意义上是正确的,但是这种方案是有用的:特别是 boost RandomAccessTraversalIterators,其中迭代器应该提供例如operator+= 即使它预计会在线性时间内发生。我不确定是否有适用于这种情况的魔术适配器,但可以很容易地为此类运算符编写一个使用 std::advance 的适配器。
猜你喜欢
  • 1970-01-01
  • 2022-11-14
  • 2015-12-04
  • 2017-09-02
  • 2011-05-17
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2020-05-18
相关资源
最近更新 更多