boost::counting_iterator range-v3 中的模拟
boost::counting_iterator analogue in range-v3
我想知道是否 range-v3 library has any view/utility providing the functionality similar to boost::counting_iterators?
我一直在寻找那种东西,但似乎没有现成的东西。但是文档不完整(至少 README 是这样建议的)所以也许我忽略了一些东西。
UPD:我实际上要寻找的不仅仅是像 view::iota 这样的整数范围,而是接受任何增量的范围视图(包装器)。
一个这样的例子是 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));
我相信 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));
你确实想要 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}
。 boost counting_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';
我想知道是否 range-v3 library has any view/utility providing the functionality similar to boost::counting_iterators?
我一直在寻找那种东西,但似乎没有现成的东西。但是文档不完整(至少 README 是这样建议的)所以也许我忽略了一些东西。
UPD:我实际上要寻找的不仅仅是像 view::iota 这样的整数范围,而是接受任何增量的范围视图(包装器)。 一个这样的例子是 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));
我相信 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));
你确实想要 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}
。 boost counting_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';