Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
STL.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
214.58 Кб
Скачать

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

Чтобы упростить задачу определения iterator_categoryvalue_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 <class T, class Distance = ptrdiff_t> struct input_iterator {};

struct output_iterator {};

// output_iterator не шаблон, потому что у итераторов вывода

// не определены ни значимый тип, ни тип расстояния.

template <class T, class Distance = ptrdiff_t>

struct forward_iterator {};

template <class T, class Distance = ptrdiff_t>

struct bidirectional_iterator {};

template <class T, class Distance = ptrdiff_t>

struct random_access_iterator {};

// iterator_category (функции категорий итераторов)

template <class T, class Distance>

inline input_iterator_tag

iterator_category(const input_iterator<T, Distance>&) {

return input_iterator_tag();

}

inline output_iterator_tag iterator_category(const output_iterator&) {

return output_iterator_tag();

}

template <class T, class Distance>

inline forward_iterator_tag

iterator_category(const forward_iterator<T, Distance>&) {

return forward_iterator_tag();

}

template <class T, class Distance>

inline bidirectional_iterator_tag

iterator_category(const bidirectional_iterator<T, Distance>&) {

return bidirectional_iterator_tag();

)

template <class T, class Distance>

inline random_access_iterator_tag

iterator_category(const random_access_iterator<T, Distance>&) {

return random_access_iterator_tag();

}

template <class T>

inline random_access_iterator_tag iterator_category(const T*) {

return random_access_iterator_tag();

}

// value_type of iterator (функции значимого типа итераторов)

template <class T, class Distance>

inline T* value_type(const input_iterator<T, Distance>&) (

return (T*) (0);

}

template <class T, class Distance>

inline T* value_type(const forward_iterator<T, Distance>&) {

return (T*) (0);

}

template <class T, class Distance>

inline T* value_type(const bidirectional_iterator<T, Distance>&) {

return (T*) (0);

}

template <class T, class Distance>

inline T* value_type(const random_access_iterator<T, Distance>&) {

return (T*) (0);

}

template <class T>

inline T* value_type(const T*) { return (T*) (0); }

// distance_type of iterator (функции типа расстояния итераторов)

template <class T, class Distance>

inline Distance* distance_type(const input_iterator<T, Distance>&) {

return (Distance*) (0);

}

template <class T, class Distance>

inline Distance* distance_type(const forward_iterator<T, Distance>&) {

return (Distance*) (0);

}

template <class T, class Distance>

inline Distance* distance_type(const bidirectional_iterator<T, Distance>&) {

return (Distance*) (0);

}

template <class T, class Distance>

inline Distance* distance_type(const random_access_iterator<T, Distance>&) {

return (Distance*) (0);

}

template <class T>

inline ptrdiff_t* distance_type(const T*) { return (ptrdiff_t*) (0); }

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

class MyIterator : public bidirectional_iterator <double, long> {

// код, осуществляющий ++, и т.д.

};

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]