irange
和counting_range
之间有什么区别?
我需要irange
来快速生成一系列整数,如下所示:
auto example = boost::irange(0, 5); /// result is {0, 1, 2, 3, 4}
但是注意到某个地方(失去了链接)的例子,而是谈论counting_range
来完成同样的任务。是否有这两者之间差异的简单解释?
答案 0 :(得分:27)
主要区别在于irange
是随机访问范围,而counting_range
则不是。{3}}。 counting_range
基于Boost.Iterator的counting_iterator
,它直接使用所有底层整数操作。 C ++中的整数几乎符合迭代器的概念:唯一缺少的是operator*
。 counting_iterator
提供operator*
作为身份操作,并将其他所有内容转发给基础类型。
另一个区别是irange
也支持不同于1的增量。
它们都没有实现它们迭代的整个整数范围,所以它们都使用O(1)内存。
答案 1 :(得分:0)
irange
和counting_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)
也支持使用不同步长的迭代,例如irange
,boost::irange(0, 10, 2)
也支持只可递增且不完全建模整数的类型。