Итератор вложенных typedefs - PullRequest
       16

Итератор вложенных typedefs

0 голосов
/ 16 августа 2011

Я создаю пользовательский тип итератора, и сейчас единственный вариант использования - std::for_each.Но, по-видимому, недостаточно имитировать интерфейс указателя (я только делаю прямую итерацию), есть, например, вложенные определения типа bajillion.Мне удалось выяснить, что ставить на iterator_category, но у меня возникли реальные проблемы с выяснением, какими должны быть value_type, pointer и reference, потому что, знаете, я не собираю контейнерздесь это итератор.Зачем for_each даже хотеть знать или заботиться?Все, что он собирается сделать, это сказать вперед другой функции.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Если вы хотите использовать тип T в качестве итератора, вы должны убедиться, что std::iterator_traits может быть специализированным для этого типа. Это означает, что вам нужно либо предоставить пять вложенных typedef, которые он откладывает по умолчанию, либо вам нужно специализировать std::iterator_traits самостоятельно. Для этого требуется пять вложенных typedef:

  • diff_type , который является некоторым типом, который может представлять расстояние между двумя итераторами (например, как было бы возвращено std::distance)

  • value_type , который является типом объекта, на который указывает итератор

  • указатель , который является типом возврата типа итератора operator->. Это не обязательно должен быть тип указателя, и он не обязательно должен быть value_type* или value_type const*. Например, если у вас есть итератор, который генерирует элементы, у вас может не быть объекта, на который вы можете вернуть указатель. В этом случае вы можете вернуть объект, который оборачивает возвращаемый элемент и перегружает operator->.

  • ссылка , которая является типом возврата типа итератора operator*. Это не обязательно должен быть ссылочный тип, и он не обязательно должен быть value_type& (или value_type const&). Например, если вы перебираете неизменный диапазон целых чисел, вы можете просто вернуть элемент по значению из соображений производительности.

  • iterator_category , который должен быть одним из тегов категории итератора или типом, производным от одного из этих тегов: input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag и random_access_iterator_tag (все в пространстве имен std). Алгоритмы могут использовать их для выбора оптимального алгоритма на основе категории итератора.

Вы не можете опустить ни одного из них; все они должны быть определены. Тем не менее, иногда один или несколько typedefs могут не иметь смысла. Например, если у вас есть итератор, который генерирует элементы char на лету, ваш итератор может не реализовать operator-> (поскольку char не является типом класса). В этом случае вы можете рассмотреть возможность использования void для типа pointer, так как он никогда не должен использоваться.

0 голосов
/ 16 августа 2011

value_type - это то, что ваш итератор повторяет. Если iter является итератором, это тип *iter. pointer является указателем на это, а reference является ссылкой на это.

...