Boost的any_range文档说明如下:
尽管底层
any_iterator
是最快的可用实现,但由于实现递增,递减,提前,等等所需的虚函数调用的成本,any_range
的性能开销仍然可观。更好的设计选择是转换为规范形式。
作者对“规范形式”的意思是什么?有人能举个例子吗?
编辑:正如此处所示,我在提升用户的邮件列表中提出了同样的问题。以下是Neil Groves,本文的原作者不得不说:
例如,将范围复制到矢量中。
是的,这正是我在编写文档时考虑的替代设计。迭代any_range的开销非常大,并且通常与将具体结果类型复制到诸如向量之类的容器中相比较差。但是,情况并非总是如此,并且Boost.Range的一些用户希望能够实现对any_range实例进行操作的算法。这有时是期望的,例如,允许从支持各种容器的共享库中暴露算法。 any_range的使用也可能有意义,其中范围内的遍历数量很小,但底层容器的内存大小非常大。
在许多情况下,性能开销无关紧要。我想确保我没有误导任何人广泛采用any_range用法。我相信这个类的有效用法很少,但有时它完全正确的设计选择。我将在适当的时候通过一些额外的澄清和示例来改进文档。
答案 0 :(得分:3)
any_range
的目的是包装一些具体的迭代器类型,以便在更改底层迭代器的详细信息时,代码的用户不需要重新编译。可以将其视为迭代器的Pimpl。
文档只是声明它总是更有效(在运行时)直接公开底层的具体迭代器类型。
答案 1 :(得分:3)
我认为它们意味着将您的范围转换为std::vector
,或者项目中标准容器的任何内容,并将迭代器返回到该范围内。
权衡取决于您的范围副本从原始范围类型到规范容器类型的成本,以及与用于实现any_range的类型擦除相关联的堆分配和虚拟函数调用的成本。根据范围中的元素数量,每个元素的大小以及在该范围内进行的传递次数,一个选项可能比另一个选项更好。