12.4.6. Пять категорий итераторов
12.4.6. Пять категорий итераторов
Для поддержки полного набора обобщенных алгоритмов стандартная библиотека определяет пять категорий итераторов, положив в основу классификации множество операций. Это итераторы чтения (InputIterator), записи (OutputIterator), однонаправленные (ForwardIterator) и двунаправленные итераторы (BidirectionalIterator), а также итераторы с произвольным доступом (RandomAccessIterators). Ниже приводится краткое обсуждение характеристик каждой категории:
* итератор чтения можно использовать для получения элементов из контейнера, но поддержка записи в контейнер не гарантируется. Такой итератор должен обеспечивать следующие операции (итераторы, поддерживающие также дополнительные операции, можно употреблять в качестве итераторов чтения при условии, что они удовлетворяют минимальным требованиям): сравнение двух итераторов на равенство и неравенство, префиксная и постфиксная форма инкремента итератора для адресации следующего элемента (оператор ++), чтение элемента с помощью оператора разыменования (*). Такого уровня поддержки требуют, в частности, алгоритмы find(), accumulate() и equal(). Любому алгоритму, которому необходим итератор чтения, можно передавать также и итераторы категорий, описанных в пунктах 3, 4 и 5;
* итератор записи можно представлять себе как противоположный по функциональности итератору чтения. Иными словами, его можно использовать для записи элементов контейнера, но поддержка чтения из контейнера не гарантируется. Такие итераторы обычно применяются в качестве третьего аргумента алгоритма (например, copy()) и указывают на позицию, с которой надо начинать копировать. Любому алгоритму, которому необходим итератор записи, можно передавать также и итераторы других категорий, перечисленных в пунктах 3, 4 и 5;
* однонаправленный итератор можно использовать для чтения и записи в контейнер, но только в одном направлении обхода (обход в обоих направлениях поддерживается итераторами следующей категории). К числу обобщенных алгоритмов, требующих как минимум однонаправленного итератора, относятся adjacent_find(), swap_range() и replace(). Конечно, любому алгоритму, которому необходим подобный итератор, можно передавать также и итераторы описанных ниже категорий;
* двунаправленный итератор может читать и записывать в контейнер, а также перемещаться по нему в обоих направлениях. Среди обобщенных алгоритмов, требующих как минимум двунаправленного итератора, выделяются place_merge(), next_permutation() и reverse();
* итератор с произвольным доступом, помимо всей функциональности, поддерживаемой двунаправленным итератором, обеспечивает доступ к любой позиции внутри контейнера за постоянное время. Подобные итераторы требуются таким обобщенным алгоритмам, как binary_search(), sort_heap() и nth-element().
Упражнение 12.6
Объясните, почему некорректны следующие примеры. Какие ошибки обнаруживаются во время компиляции?
(a) const vectorstring file_names( sa, sa+6 );
vectorstring::iterator it = file_names.begin()+2;
(b) const vectorint ivec;
fill( ivec.begin(), ivec.end(), ival );
(c) sort( ivec.begin(), ivec.end() );
(d) listint ilist( ia, ia+6 );
binary_search( ilist.begin(), ilist.end() );
(e) sort( ivec1.begin(), ivec3.end() );
Упражнение 12.7
Напишите программу, которая читает последовательность целых чисел из стандартного ввода с помощью потокового итератора чтения istream_iterator. Нечетные числа поместите в один файл посредством ostream_iterator, разделяя значения пробелом. Четные числа таким же образом запишите в другой файл, при этом каждое значение должно размещаться в отдельной строке.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
13. Пять минут
13. Пять минут Как научиться влиять на людей за пять минут? Берете свою тему, небольшой вопрос и рассказываете, как добиться результата за пять минут – за время прослушивания аудио, просмотра видео или чтения
Страницы категорий
Страницы категорий Как правило, на сайте предлагается не один товар, а несколько вещей из разных категорий. Товары могут отличаться по цене, по марке производителя, по назначению и т. д.Для того чтобы упростить выбор товара, используются страницы категорий.Они позволяют
13.2.9. Реализация параллельных итераторов
13.2.9. Реализация параллельных итераторов Предположим, что нужно параллельно обходить несколько объектов, то есть для каждого объекта найти первый элемент, потом второй, потом третий и т.д.Рассмотрим следующий пример. Пусть compose — имя магического метода, который выполняет
Теги итераторов (Iterator tags)
Теги итераторов (Iterator tags) Чтобы осуществлять алгоритмы только в терминах итераторов, часто бывает необходимо вывести тип значения и тип расстояния из итератора. Для решения этой задачи требуется, чтобы для итератора i любой категории, отличной от итератора вывода,
Примеры использования тегов итераторов
Примеры использования тегов итераторов Для всех типов обычных указателей мы можем определить value_type и distance_type с помощью следующего:template ‹class T›inline T* value_type(const T*) {return (T*)(0);}template ‹class T›inline ptrdiff_t* distance_type(const T*) {return (ptrdiff_t*)(0);}Тогда, если мы хотим осуществить обобщённую функцию
Адаптеры итераторов (Iterator adaptors)
Адаптеры итераторов (Iterator adaptors) Обратные итераторы (Reverse iterators) Двунаправленные итераторы и итераторы произвольного доступа имеют соответствующие адаптеры обратных итераторов, которые выполняют итерации через структуру данных в противоположном направлении.Они имеют
4.10 . Упражнение 10. Использование категорий UDP
4.10. Упражнение 10. Использование категорий UDP Перед выполнением упражнения 10 внимательно прочитайте подразделы 1.3, 2.1 и 2.2. И. Перейдите в меню Dictionary/UDP Keywords и в диалоге UDP KeywordList внесите ключевые слова UDP (рис. 4.10.1):Расход ресурсов;Документация;Информационная система. Рис.
Пять классов ноутбуков
Пять классов ноутбуков К сожалению, классификации в виде промышленного стандарта нет, именно поэтому PR-отделы изголяются как могут и регулярно изобретают собственные варианты. Житейский опыт подсказывает пять основных классов ноутбуков:Класс номер ноль –
Пять критериев
Пять критериев Чтобы обеспечить расширяемость (extendibility) и повторное использование (reusability), двух основных факторов качества, предложенных в лекции 1, необходима система с гибкой архитектурой, состоящая из автономных программных компонент. Именно поэтому в лекции 1 введен
Пять правил
Пять правил Из рассмотренных критериев следуют пять правил, которые должны соблюдаться, чтобы обеспечить модульность:[x]. Прямое отображение (Direct Mapping). [x]. Минимум интерфейсов (Few Interfaces). [x]. Слабая связность интерфейсов (Small interfaces - weak coupling). [x]. Явные интерфейсы (Explicit Interfaces). [x].
Пять принципов
Пять принципов Из предыдущих правил и, косвенным образом, из критериев следуют пять принципов конструирования ПО:[x]. Принцип Лингвистических Модульных Единиц (Linguistic Modular Units).[x]. Принцип Самодокументирования (Self-Documentation).[x]. Принцип Унифицированного Доступа (Uniform Access).[x].
Тест-драйв: Вне категорий: цифровая камера Panasonic DMC-FZ5
Тест-драйв: Вне категорий: цифровая камера Panasonic DMC-FZ5 Автор: Сергей ЛеоновВот так всегда и бывает: пишешь статью, стараясь не перегружать читателя техническими тонкостями (до аса отступлений от темы — Голубицкого — мне, конечно же, далеко), в результате не хватает места и
Пять современных планшетов
Пять современных планшетов Автор: Олег НечайОпубликовано 06 декабря 2011 годаAcer Iconia Tab A Series (A500/501)Дизайнеры Acer наглядно продемонстрировали, что можно создать вполне привлекательный планшет, и не копируя минималистичный образ iPad. Корпус собран из металлического сплава с
Пять мультимедийных ноутбуков
Пять мультимедийных ноутбуков Автор: Олег НечайОпубликовано 28 ноября 2011 годаAcer Aspire Ethos 8951GНовая серия мультимедийных ноутбуков премиум-класса Aspire Ethos выделяется дизайном: крышка компьютера выполнена из текстурированного матового сплава магния и алюминия, а панель под