c++ - Boost any_range 与 "canonical form"- 后者是什么?

标签 c++ boost iterator boost-range

Boost 的 any_range文档说明如下:

Despite the underlying any_iterator being the fastest available implementation, the performance overhead of any_range is still appreciable due to the cost of virtual function calls required to implement increment, decrement, advance, equal etc. Frequently a better design choice is to convert to a canonical form.

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

编辑:正如这里所建议的,我在 boost 用户的邮件列表中问了同样的问题。以下是本文原作者尼尔·格罗夫斯 (Neil Groves) 的原话:

For example, copying the range into a vector.

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

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

最佳答案

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

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

关于c++ - Boost any_range 与 "canonical form"- 后者是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5601303/

相关文章:

rust - 如何正确地将迭代器传递给 Rust 中的函数

python - 列表生成器困惑

c++ - 有没有一种很好的方法可以将 std::minmax(a, b) 分配给 std::tie(a, b)?

c++ - 我认为 STL 导致我的应用程序的内存使用量增加了三倍

c++ - 我如何让这个递归规则起作用?

c# - 将 boost::archive 写入 C# 流

c++ - 无法访问外部文件中定义的数组,W/O 关键字 "extern"

c++ - 传递 std::function<bool(std::string)> &&callback(即作为右值 move )是否安全,效果如何?

c++ - Boost::Process 编译问题,必须修改 lib 才能使其工作

C++ vector 迭代器