9

irange和有什么区别counting_range

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

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

但是注意到某处的一个例子(丢失了链接),它谈论的是counting_range要完成相同的任务。对这两者之间的区别有简单的解释吗?

4

2 回答 2

28

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

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

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

于 2014-02-01T20:16:55.227 回答
1

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

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),实际上没有区别(当然,除了每个范围的类型!)。

但是,irange它还支持具有不同步长的迭代,例如 ,boost::irange(0, 10, 2)并且counting_range还支持仅可递增且不完全建模整数的类型。

于 2017-11-07T10:34:59.890 回答