irange
和有什么区别counting_range
?
我需要irange
快速生成一系列整数,如下所示:
auto example = boost::irange(0, 5); /// result is {0, 1, 2, 3, 4}
但是注意到某处的一个例子(丢失了链接),它谈论的是counting_range
要完成相同的任务。对这两者之间的区别有简单的解释吗?
主要区别在于它irange
是随机访问范围,而counting_range
不是。counting_range
基于 Boost.Iterator's counting_iterator
,它直接使用所有底层整数运算。C++ 中的整数几乎符合迭代器的概念:唯一缺少的是operator*
. counting_iterator
提供一个operator*
作为标识操作并将其他所有内容转发给底层类型。
另一个区别是irange
它还支持不同于 1 的增量。
它们都没有实现它们迭代的整个整数范围,因此它们都使用 O(1) 内存。
两者都irange
为counting_range
整数类型建模随机访问范围。正如counting_range
s 文档所指出的,它的迭代器类别是根据以下算法确定的:
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
还支持仅可递增且不完全建模整数的类型。