范围-v3中的boost :: counting_iterator analogue

时间:2017-06-09 03:01:10

标签: c++ boost range-v3

我想知道range-v3库是否有任何提供与boost::counting_iterators类似的功能的视图/实用程序?

我一直在寻找那种东西,但似乎没有什么可以随时获得的。但是文档是不完整的(至少README建议如此)所以也许我忽略了一些东西。

UPD:我实际上寻找的不仅仅是像view :: iota这样的整数范围,而是一个接受任何Incrementable的范围视图(包装器)。 其中一个例子是Boost.CountingIterator文档中的以下代码:

int N = 7;
std::vector<int> numbers;
...
// the code below does what I am actually looking for
// I would like to use a single range instead of two separate iterators here
std::vector<std::vector<int>::iterator> pointers;
std::copy(boost::make_counting_iterator(numbers.begin()),
          boost::make_counting_iterator(numbers.end()),
          std::back_inserter(pointers));

2 个答案:

答案 0 :(得分:4)

事实上,你确实需要view::iota。它接受范围迭代器类型的任何WeaklyIncrementable类型(不仅是整数类型),以及作为范围sentinel的WeaklyEqualityComparable类型的任何类型。因此view::iota(0, 8)是整数范围{0,1,2,3,4,5,6,7},而view::iota(i, s)是迭代器{i,i+1,i+2,...,s}的范围。提升counting_iterator示例将范围-v3转换为(DEMO):

int N = 7;
std::vector<int> numbers = ranges::view::iota(0, N);

std::vector<std::vector<int>::iterator> pointers =
    ranges::view::iota(numbers.begin(), numbers.end());

std::cout << "indirectly printing out the numbers from 0 to " << N << '\n';
ranges::copy(ranges::view::indirect(pointers),
    ranges::ostream_iterator<>(std::cout, " "));
std::cout << '\n';

答案 1 :(得分:2)

我相信view::ints正是您所寻找的。您可以创建无限范围,并使用view::take

之类的内容对其进行截断
using namespace ranges;
int x = accumulate(view::ints(0) | view::take(10), 0); // 45

或者你可以制作一个有界范围(低位,高级别)

int x = accumulate(view::ints(0, 10), 0);

对于您的示例,您可以改为使用view::iota

copy(view::iota(numbers.begin(), numbers.end()), back_inserter(pointers));