【问题标题】:Boost any_range vs. "canonical form" - what is the latter?提升 any_range 与“规范形式” - 后者是什么?
【发布时间】:2011-04-08 22:11:01
【问题描述】:

Boost 的 any_range 文档说明如下:

尽管底层的any_iterator 是最快的可用实现,但any_range 的性能开销仍然是可观的,因为实现递增、递减、推进、相等等所需的虚函数调用成本很高。通常是更好的设计选择是转换为规范形式

作者所说的“规范形式”是什么意思?谁能举个例子?

编辑: 正如这里所建议的,我在 boost 用户的邮件列表中提出了同样的问题。以下是本文原作者 Neil Groves 的原话:

例如,将范围复制到向量中。

是的,这正是我在编写文档时想到的替代设计。在 any_range 上进行迭代的开销是相当可观的,并且通常与将具体结果类型复制到容器(例如向量)中相比很差。然而,情况并非总是如此,Boost.Range 的一些用户希望能够实现对 any_range 实例进行操作的算法。这有时是可取的,例如,允许从支持各种容器的共享库中公开算法。使用 any_range 也可能适用于该范围内的通过次数较少但底层容器的内存大小非常大的情况。

在许多情况下,性能开销无关紧要。我想确保我没有误导任何人广泛采用 any_range 用法。我相信这个类的有效用法很少,但有时它正是正确的设计选择。我将在适当的时候通过一些额外的说明和示例来改进文档。

【问题讨论】:

  • “规范形式”是一种奇特的说法,通常除非涉及数学。基本上他们说std::iterator 会表现得更好。
  • 这条评论毫无意义。 std::iterator 不是迭代器。

标签: c++ boost iterator boost-range


【解决方案1】:

我认为他们的意思是将您的范围转换为 std::vector,或者您项目中的任何标准容器,然后将迭代器返回到其中。

权衡是在将范围从原始范围类型复制到规范容器类型的成本与与用于实现 any_range 的类型擦除相关的堆分配和虚函数调用成本之间进行权衡。根据该范围内的元素数量、每个元素的大小以及在该范围内将进行多少次传递,一种选择可能比另一种更好。

【讨论】:

    【解决方案2】:

    any_range 的目的是包装一些具体的迭代器类型,这样如果您更改底层迭代器的详细信息,您的代码用户就不需要重新编译。将其视为迭代器的Pimpl

    文档只是说明直接公开底层的具体迭代器类型总是更有效(在运行时)。

    【讨论】:

    • 如果是这样,那他们为什么说“转换为”?
    • @paperjam :我不知道,但大多数 boost 库作者的母语不是英语,因此在 boost 库文档中找到非常奇怪的措辞并不罕见。如果这个答案不令人满意,您可以随时在 boost 用户的邮件列表中提问:lists.boost.org/mailman/listinfo.cgi/boost-users
    猜你喜欢
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2012-09-04
    • 2020-12-25
    • 2021-01-23
    • 2016-10-12
    • 1970-01-01
    相关资源
    最近更新 更多