Руководство по стандартной библиотеке шаблонов STL

         

Примитивы, определённые в библиотеке


    Чтобы упростить задачу определения iterator_category, value_type и distance_type для определяемых пользователем итераторов, библиотека обеспечивает следующие предопределённые классы и функции:

// iterator tags (теги итераторов) struct input_iterator_tag {}; struct output_iterator_tag {}; struct forward_iterator_tag {}; struct bidirectional_iterator_tag {}; struct random_access_iterator_tag {}; // iterator bases (базовые классы итераторов) template struct input_iterator {}; struct output_iterator {}; // output_iterator не шаблон, потому что у итераторов вывода // не определены ни значимый тип, ни тип расстояния. template struct forward_iterator {}; template struct bidirectional_iterator {}; template struct random_access_iterator {}; // iterator_category (функции категорий итераторов) template inline input_iterator_tag iterator_category(const input_iterator&) { return input_iterator_tag(); } inline output_iterator_tag iterator_category(const output_iterator&) { return output_iterator_tag(); } template inline forward_iterator_tag iterator_category(const forward_iterator&) { return forward_iterator_tag(); } template inline bidirectional_iterator_tag iterator_category(const bidirectional_iterator&) { return bidirectional_iterator_tag(); ) template inline random_access_iterator_tag iterator_category(const random_access_iterator&) { return random_access_iterator_tag(); } template inline random_access_iterator_tag iterator_category(const T*) { return random_access_iterator_tag(); } // value_type of iterator (функции значимого типа итераторов) template inline T* value_type(const input_iterator&) ( return (T*) (0); } template inline T* value_type(const forward_iterator&) { return (T*) (0); } template inline T* value_type(const bidirectional_iterator&) { return (T*) (0); } template inline T* value_type(const random_access_iterator&) { return (T*) (0); } template inline T* value_type(const T*) { return (T*) (0); } // distance_type of iterator (функции типа расстояния итераторов) template inline Distance* distance_type(const input_iterator&) { return (Distance*) (0); } template inline Distance* distance_type(const forward_iterator&) { return (Distance*) (0); } template inline Distance* distance_type(const bidirectional_iterator&) { return (Distance*) (0); } template inline Distance* distance_type(const random_access_iterator&) { return (Distance*) (0); } template inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*) (0); }

    Если пользователь хочет определить двунаправленный итератор для некоторой структуры данных, содержащей double, и такой, чтобы работал с большой (large) моделью памяти компьютера, то это может быть сделано таким определением:

class MyIterator : public bidirectional_iterator { // код, осуществляющий ++, и т.д. };

    Тогда нет необходимости определять iterator_category, value_type, и distance_type в MyIterator.



Содержание раздела