Итератор «end ()» для устройств обратной вставки?

Для итераторов, таких как те, которые возвращаются из 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 - лучше ли не проверять диапазон, а вместо этого предоставить альтернативный способ получить требуемый выходной диапазон? (Что в любом случае потребуется для необработанных массивов, но не требуется для обратных вставок в вектор.) Это могло бы показаться менее надежным, но я изо всех сил пытаюсь заставить «надежный» (см. Выше) работать.

5
задан James McNellis 1 January 2011 в 08:07
поделиться