2

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

我一直在寻找那种东西,但似乎没有什么现成的。但是文档不完整(至少自述文件是这样建议的)所以也许我忽略了一些东西。

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));
4

2 回答 2

4

事实上,你确实想要view::iota. 它接受WeaklyIncrementable范围迭代器类型的任何类型(不仅是整数类型),以及该类型的任何WeaklyEqualityComparable类型作为范围标记。view::iota(0, 8)整数{0,1,2,3,4,5,6,7}的范围也是如此view::iota(i, s),迭代器的范围也是如此{i,i+1,i+2,...,s}。boostcounting_iterator示例转换为 range-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';
于 2017-06-09T06:37:24.360 回答
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));
于 2017-06-09T05:12:39.210 回答