Канонический способ определения итератора прямого вывода

Как определить каноническим способом итераторы прямого вывода в C ++ 11?

Согласно стандарту forward_iterator является только input_iterator. Таким образом, соответствующий forward_iterator_tag только расширяется input_iterator_tag, Если мы используем std::iterator Чтобы определить наши итераторы, какой тег мы используем для прямого итератора вывода?

Можно ли определить частный тег, который расширяет оба forward_iterator_tag а также output_iterator_tag или есть лучшее решение?

7

Решение

Каноническая вещь, которую нужно сделать, это наследовать от std::iterator<std::forward_iterator_tag, T> только. Итераторы имеют только одну категорию.

Стандарт не имеет алгоритмов (или других применений) для выходного итератора, который также является прямым итератором. Все использование выходных итераторов в стандарте требует только однопроходного.

Вместо этого стандарт имеет идею изменяемых и неизменяемых итераторов категорий forward / bidi / randomaccess. Все алгоритмы, которые должны писать через итераторы, и которые требуют лучше, чем однопроходный, также читают через те же итераторы, через которые они пишут. Это std::remove, std::sort и другие алгоритмы мутации.

Разница между изменяемыми и неизменяемыми итераторами не определяется тегом итератора, это определяется тем, правильно ли сформированы выражения присваивания. Так, например, если вы передаете итератор std::sort это неизменяемый, тогда алгоритм все равно не будет компилироваться, поэтому обычно нет необходимости, чтобы входной итератор также был помечен output_iterator_tag, Все алгоритмы, которые требуют OutputIterator Просто буду работать с изменяемым ForwardIteratorопять же нет необходимости помечать его output_iterator_tag,

Если ваши потребности отличаются от требований стандартных алгоритмов, тогда я не могу сразу подумать о причине, по которой ваше предложение не будет работать для ваших итераторов. Но он не обнаружит изменяемые стандартные итераторы. Например std::deque<int>::iterator а также int* иметь категорию итератора random_access_iterator_tag, а не ваш личный тег и не имеет ничего общего с output_iterator_tag, Так что вам, вероятно, будет лучше определить свой собственный класс черт, чем надеяться адаптировать существующие iterator_traits::iterator_category предоставить информацию, которую вы хотите.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]