Boost中橙色和计数范围之间的差异

时间:2013-01-01 06:05:19

标签: c++ boost integer range counting

irangecounting_range之间有什么区别?

我需要irange来快速生成一系列整数,如下所示:

auto example = boost::irange(0, 5); /// result is {0, 1, 2, 3, 4}

但是注意到某个地方(失去了链接)的例子,而是谈论counting_range来完成同样的任务。是否有这两者之间差异的简单解释?

2 个答案:

答案 0 :(得分:27)

主要区别在于irange是随机访问范围,而counting_range则不是。{3}}。 counting_range基于Boost.Iterator的counting_iterator,它直接使用所有底层整数操作。 C ++中的整数几乎符合迭代器的概念:唯一缺少的是operator*counting_iterator提供operator*作为身份操作,并将其他所有内容转发给基础类型。

另一个区别是irange也支持不同于1的增量。

它们都没有实现它们迭代的整个整数范围,所以它们都使用O(1)内存。

答案 1 :(得分:0)

irangecounting_range都为整数类型建模随机访问范围。正如Foo::testPrivate文档指出的那样,它的迭代器类别是根据以下算法确定的:

counting_range

因此,对于if (CategoryOrTraversal is not use_default) return CategoryOrTraversal else if (numeric_limits<Incrementable>::is_specialized) return iterator-category(random_access_traversal_tag, Incrementable, const Incrementable&) else return iterator-category(iterator_traversal<Incrementable>::type, Incrementable, const Incrementable&) boost::irange(0, 10)之类的简单范围,实际上没有区别(当然,除了每个范围的类型之外!)。

但是,boost::counting_range(0, 10)也支持使用不同步长的迭代,例如irangeboost::irange(0, 10, 2)也支持只可递增且不完全建模整数的类型。