Вид среза для диапазонов C ++ 20 - PullRequest
4 голосов
/ 17 июня 2019

Python itertools имеет процедуру islice(seq, start, stop, step), которая принимает последовательность и возвращает итератор каждого step-го значения значений последовательности между start и stop.

Имеет ли диапазоныбиблиотека C ++ 20 предоставляет аналогичную функциональность, например, такую ​​как slice, которая принимает итератор произвольного доступа start, часовой stop и значение шага step и возвращает итератор произвольного доступа, которыйвыполняет итерацию по каждому step -ому значению между start и stop?

Если это не так, может ли такой адаптер итератора быть реализован с использованием примитивов, предоставляемых библиотекой Ranges.

(Я знаю, как я могу реализовать такой адаптер вручную, так что это не вопрос.)

1 Ответ

6 голосов
/ 17 июня 2019

Не совсем.

C ++ 20 будет иметь view::iota, который дает вам последовательность от начального значения до дозорного. Тем не менее, он не имеет шага функциональности. Он только увеличивается (через ++).

Однако вы можете объединить его с range-v3's view::stride, чтобы добавить в действия. То есть:

auto evens = view::iota(0, 100) | view::stride(2); // [0, 2, 4, 6, ... ]

Для существующих диапазонов есть view::slice, что также не требует большого шага. Но они ортогональны и хорошо выглядят:

auto even_teens  = view::iota(0, 100)
                 | view::slice(10, 20)
                 | view::stride(2); // [10, 12, 14, 16, 18]
...