2014-12-19 120 views
0

我有任何容器不提供随机访问迭代器,目标是创建一个适配器,它接受输入这样的迭代器并向容器提供随机访问迭代器接口。适配器将任何迭代器转换为随机访问迭代器

我不知道如何使用boost::iterator_facade,因为它是一个有点混乱: - /上有堆栈溢出一些例子,但我不知道如何使用它们(here

任何链接/例子可能是很有帮助。 (我读的例子在boost他们有点难以消化考虑我在boost

+2

该标准要求所有的操作上一个迭代器采取摊销不变的时间。你不能采用一个迭代器,它用'N(N)'时间来增加'N',并且神奇地把它变成一个迭代器,它需要'O(1)'时间来做同样的事情。结果不会满足随机访问迭代器的复杂性要求。 – 2014-12-19 05:34:40

+0

是否使用'std :: advance'会解决你的问题? – Anycorn 2014-12-19 05:41:01

+0

同意了,我理解迭代器和容器的设计和概念......但即使性能最差也可能实现。如果是这样,我只想自己实现它,但我只需要任何想法/开始。谢谢! – KawKaw 2014-12-19 05:42:41

回答

1

经验,你不希望这样做。

要么

  • 使用广义范围内库设施做“对飞”的缓存,像埃里克Niebler的Container Ranges concept from his Ranges proposal
  • 明确编写的意图,例如,通过创建一个标签派出过载你的函数说,“具体化”的输入范围为随机访问算法的临时容器

如果你真的坚持,是的,你可以实现你的想法,但我不明白它会获得什么,除了隐藏运行时/存储成本。尤其是,它不会是微不足道的需要,以保持一生around.¹


轻微相关:升压灵有boost::spirit::multi_pass适配器,但只从升级到InputIteratorForwardIterator(允许回溯)。

¹(你做什么,当你有一个临时性的即已经是一个随机存取范围?你不能把对它的引用,但你也应该不必复制它。)