#c #templates #iterator
#c #шаблоны #итератор
Вопрос:
Я знаю, что библиотека STL использует различные типы итераторов для обхода своих контейнеров: ввод, вывод, прямой, двунаправленный и произвольный доступ.
Я также знаю, что итераторы абстрагируются от классического интерфейса указателя C. Таким образом, класс итератора должен иметь операторы , * и так далее (действовать как указатель).
Написан ли интерфейс для каждого типа итератора в какой-либо спецификации? Является ли этот интерфейс просто соглашением, используемым в библиотеке STL, или существует какая-то иерархия классов, из которых я должен расширять свои итераторы?
Из того, что я понимаю, я должен просто «скопировать» соглашения об интерфейсе, которым следуют в библиотеке STL, чтобы иметь возможность использовать с ней свои итераторы.
Комментарии:
1. Вам не обязательно что-либо писать (например, итератор вектора — это просто указатель), или вам, возможно, придется писать много. Если вы пишете свой собственный итератор, вы пишете его с нуля, и это очень шумно. Вы должны убедиться, что ваш итератор правильно помечен; см. Документацию
std::iterator_traits
. Существует библиотека Boost, «фасад итератора», которая немного упрощает написание итераторов.2. @KerrekSB: 1 но почему вы не указали в качестве ответа?
3. @Bathsheba: На самом деле я не хочу объяснять все детали и нести ответственность … просто так много шума, который стоит того, чтобы разобраться, но никогда не интересен.
Ответ №1:
Вы можете просмотреть требования к интерфейсу каждой категории итератора на странице итератора.
Как уже упоминалось, люди часто не утруждают себя реализацией всех интерфейсов итератора с нуля, а используют boost ::iterator library для обработки шаблонного кода.