Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

C++. Энциклопедия пользователя - Либерти Дж.

Либерти Дж. C++. Энциклопедия пользователя — Москва, 2001. — 581 c.
Скачать (прямая ссылка): enciklopediyapolzovatelya2001.djvu
Предыдущая << 1 .. 88 89 90 91 92 93 < 94 > 95 96 97 98 99 100 .. 280 >> Следующая

¦ Быть сравниваемым на равенство: итератор должен иметь перегруженный оператор равенства == и оператор неравенства !=. Данные операторы позволяют сравнивать два итератора.
Вводной итератор представляет собой итератор, который можно разадресовать, когда он указывает на элемент в последовательности. Кроме того, итератор может указывать на конец последовательности. Когда итератор указывает на конец последовательности, то он фактически указывает на место как раз после последнего элемента в последовательности и о нем говорят, что он "past the end". Итератор past-the-end нельзя разадресовать.
Вводной оператор действителен, если его можно разадресовать в действительный объект или он past-the-end. Вводной итератор гарантирует доступ на чтение к указываемому объекту. Например, если и является вводным итератором, у которого value_type — это Т, то доступ к указываемому объекту получают путем разадресации:
Т t = *ii; // правильно
Поскольку вводные итераторы не допускают доступ на запись к указываемым элементам, то следующие операторы содержат ошибку:
const Т& operator*() const; const Т* operator-»() const;
iterators operator++() ;
iterator operator++(int);
// префикс-инкремент /! постфикс-инкремент
typedef typename Itor::iterator_category typedef typename Itor::value_type typedef typename Itor::difference_type typedef typename Itor::pointer typedef typename Itor::reference
iterator_category; value_type; difference_type; pointer;
reference;
Вводные итераторы
T t;
*ii = t; // ошибка
Итераторы и алгоритмы STL
Глава 7
197
Вводной итератор можно нарастить для указания на следующий элемент. Должны быть определены как префиксный оператор приращения (++Н), так и постфиксный оператор приращения (ii++). Вводной итератор можно наращивать, если ++Н имеет место. Итераторы past-the-end наращивать нельзя.
Выводные итераторы
Выводной итератор должен быть по умолчанию конструируемым и присваиваемым. Выводной итератор гарантирует доступ к записи, но не доступ для чтения. Рассмотрим следующие операторы:
т t;
*oi = t; // правильно
t = *oi; // ошибка
Кроме того, выводной итератор определяет и префиксный, и постфиксный операторы приращения.
Пересылаемые итераторы
Пересылаемый итератор похож на видеоленту — его можно проигрывать в одном направлении, но зато многократно. Он обладает всеми характеристиками вводного итератора, т.е. он по умолчанию конструируемый, присваиваемый и сравниваемый на равенство. Кроме того, пересылаемый итератор можно разадре-совывать и наращивать. Пересылаемые итераторы обеспечивают доступ к указываемым объектам как на чтение, так и на запись.
Двунаправленные итераторы
Двунаправленный итератор похож на пересылаемый, за исключением того, что он может и уменьшаться.
Итераторы произвольного доступа
Итератор произвольного доступа реализует все операции двунаправленного итератора и добавляет методы для перемещения от одного элемента к другому за постоянное время (0(1)). Дистанция между исходным элементом и элементом места назначения не важна, т.е. итератор произвольного доступа так же быстр при переходе от первого элемента к тридцать седьмому, как и при переходе от первого элемента ко второму.
Поскольку итераторы произвольного метода доступа могут перемещаться более чем на один шаг, то для них определены операторы сложения (+ и +=) и вычитания (- и -=). Итераторы произвольного доступа также определяют оператор индексирования []. Если п является итератором произвольного доступа, то ri[n] возвращает n-й элемент в последовательности.
Итератор произвольного доступа сравним не только на равенство, но и по величине. Следовательно, он определяет операторы <, >, <= и >=. Фундаментальным из них является только оператор <. Все остальные операторы можно породить от него.
Итераторные операции
В дополнение к перегруженным операторам библиотека STL обеспечивает две функции, которые возвращают количество элементов между двумя элементами и которые "прыгают" с одного элемента на любой другой элемент в контейнере.
Функция distance()
Функция distance находит дистанцию между текущими позициями двух итераторов, т.е. если первый итератор указывает на элемент 12 в последовательности, а второй на элемент 47 в той же последовательности, то дистанция будет равна 35.
template<class InputIteratoc>
iterator_traits<InputIterator>::difference_type
distance(Inputlterator first, Inputlterator last);
Как вычисляется дистанция между двумя итераторами? Для итераторов с произвольным доступом это легко, поскольку они обеспечивают операторы вычитания. Мы можем просто вычесть первый итератор из последнего и получить дистанцию:
template<class RandomAccessIterator>
i terator_traits<RandomAccessIterator>::di fference_type
distance(RandomAccessIterator first, RandomAccessIterator last) { return last — first;
)
198
Вопросы реализации
Часть II
Для других итераторов это несколько усложнятся, поскольку для них не определен оператор вычитания. Необходимо пройти по последовательности от первого итератора до последнего и зарегистрировать количество шагов:
Предыдущая << 1 .. 88 89 90 91 92 93 < 94 > 95 96 97 98 99 100 .. 280 >> Следующая