Для итераторов, таких как те, которые возвращаются из std :: back_inserter ()
, есть ли что-то, что можно использовать как "конечный" итератор?
Сначала это кажется немного бессмысленным, но у меня есть API:
template<typename InputIterator, typename OutputIterator>
void foo(
InputIterator input_begin,
InputIterator input_end,
OutputIterator output_begin,
OutputIterator output_end
);
foo
выполняет некоторую операцию над входной последовательностью, генерируя выходную последовательность. (Чья длина известна foo
, но может быть равна или не равна длине входной последовательности.)
Параметр output_end
является нечетной частью: std :: copy
, например, этого не делает и предполагает, что вы не собираетесь передавать ему мусор. foo
делает это для обеспечения проверки диапазона: если вы передаете слишком малый диапазон, он генерирует исключение во имя защитного программирования. (Вместо возможной перезаписи случайных битов в памяти.)
Теперь, скажем, я хочу передать foo
устройство обратной вставки, в частности, из std :: vector
, у которого нет ограничений вне ограничений памяти. Мне все еще нужен "конец" итератор - в данном случае то, что никогда не сравнится с равным. (Или, если бы у меня был std :: vector
, но с ограничением по длине, возможно, он мог бы иногда сравнивать равный?)
Как мне это сделать? У меня есть возможность изменить API foo
- лучше ли не проверять диапазон, а вместо этого предоставить альтернативный способ получить требуемый выходной диапазон? (Что в любом случае потребуется для необработанных массивов, но не требуется для обратных вставок в вектор.) Это могло бы показаться менее надежным, но я изо всех сил пытаюсь заставить «надежный» (см. Выше) работать.