Примитивы, определённые в библиотеке
Примитивы, определённые в библиотеке
Чтобы упростить задачу определения 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 ‹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_category, value_type, и distance_type в MyIterator.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
4. Примитивы синхронизации
4. Примитивы синхронизации ОС QNX Neutrino предоставляет широкий набор элементов синхронизации выполнения потоков, как в рамках одного процесса, так и разных. Это практически полный спектр примитивов, описываемых как базовым стандартом POSIX, так и всеми его расширениями
10.4. Примитивы процессов
10.4. Примитивы процессов Несмотря на относительно длинную дискуссию, необходимую для описания процесса, создание и уничтожение процессов в Linux достаточно
13.4. Сохранение снимков в библиотеке фотографий
13.4. Сохранение снимков в библиотеке фотографий Постановка задачи Необходимо обеспечить возможность сохранения снимков в пользовательской библиотеке
13.5. Сохранение видео в библиотеке фотографий
13.5. Сохранение видео в библиотеке фотографий Постановка задачи Требуется сохранить в библиотеке фотографий видеоролик, доступный по URL, например ролик из пакета вашего
15. Перегруженные операторы и определенные пользователем преобразования
15. Перегруженные операторы и определенные пользователем преобразования В главе 15 мы рассмотрим два вида специальных функций: перегруженные операторы и определенные пользователем преобразования. Они дают возможность употреблять объекты классов в выражениях так же
19.2.1. Исключения, определенные как иерархии классов
19.2.1. Исключения, определенные как иерархии классов В главе 11 мы использовали два типа класса для описания исключений, возбуждаемых функциями-членами нашего класса iStack:class popOnEmpty { ... };class pushOnFull { ... };В реальных программах на C++ типы классов, представляющих исключения, чаще
19.2.8. Иерархия классов исключений в стандартной библиотеке C++
19.2.8. Иерархия классов исключений в стандартной библиотеке C++ В начале этого раздела мы определили иерархию классов исключений, с помощью которой наша программа сообщает об аномальных ситуациях. В стандартной библиотеке C++ есть аналогичная иерархия, предназначенная для
Функции, определенные пользователем
Функции, определенные пользователем Для сохранения своего малого объема Firebird поставляется с весьма скромным арсеналом встроенных (родных) функций трансформации данных. Пользователи могут писать свои собственные функции на известном им языке, таком как C/C++, Pascal или Object
Объекты, определенные пользователем
Объекты, определенные пользователем При восстановлении копии на сервер, отличный от того, с которого были сделаны копии, вы должны обеспечить существование на новом сервере наборов символов и порядков сортировки, на которые ссылается копия. Копия не может быть
Поверхностные примитивы
Поверхностные примитивы Стандартные трехмерные примитивы в программе AutoCAD можно создать несколькими способами. Первый способ – использование команды 3D. После ее запуска в командной строке появится запрос: Enter an option [Box/Cone/DIsh/DOme/Mesh/Pyramid/Sphere/Torus/Wedge]: Выбрав один из параметров
Графические примитивы
Графические примитивы Графические примитивы представляют собой процедуры, осуществляющие рисование в графическом окне. Рисование осуществляется текущим пером (линии), текущей кистью (заливка замкнутых областей) и текущим шрифтом (вывод строк). procedure SetPixel(x,y: integer; c: Color);
Поиск и упорядочивание в библиотеке
Поиск и упорядочивание в библиотеке В правой верхней части окна библиотеки можно встретить уже знакомую по ранее рассмотренным приложениям строку поиска. С ее помощью вы можете быстро находить нужные композиции, набрав только первые буквы названия песни, альбома,