12.4.1. Итераторы вставки
12.4.1. Итераторы вставки
Вот еще один фрагмент программы, в котором есть тонкая, но серьезная ошибка.
int ia[] = { 0, 1, 1, 2, 3, 5, 5, 8 };
vector int ivec( ia, ia+8 ), vres;
// ...
// поведение программы во время выполнения не определено
Видите ли вы, в чем она заключается?
unique_copy( ivec.begin(), ivec.end(), vres.begin() );
Проблема вызвана тем, что алгоритм unique_copy() использует присваивание для копирования значения каждого элемента из вектора ivec, но эта операция завершится неудачно, поскольку в vres не выделено место для хранения девяти целых чисел. Можно было бы написать две версии алгоритма unique_copy(): одна присваивает элементы, а вторая вставляет их. Эта последняя версия должна, в таком случае, поддерживать вставку в начало, в конец или в произвольное место контейнера. Альтернативный подход, принятый в стандартной библиотеке, заключается в определении трех адаптеров, которые возвращают специальные итераторы вставки:
* back_inserter() вызывает определенную для контейнера операцию вставки push_back() вместо оператора присваивания. Аргументом back_inserter()
// правильно: теперь unique_copy() вставляет элементы с помощью
// vres.push_back()...
unique_copy( ivec.begin(), ivec.end(),
является сам контейнер. Например, вызов unique_copy() можно исправить, написав:
back_inserter( vres ) );
* front_inserter() вызывает определенную для контейнера операцию вставки push_front() вместо оператора присваивания. Аргументом front_inserter() тоже является сам контейнер. Заметьте, однако, что класс vector не поддерживает
// увы, ошибка:
// класс vector не поддерживает операцию push_front()
// следует использовать контейнеры deque или list
unique_copy( ivec.begin(), ivec.end(),
push_front(), так что использовать такой адаптер для вектора нельзя:
front_inserter( vres ) );
* inserter() вызывает определенную для контейнера операцию вставки insert() вместо оператора присваивания. inserter() принимает два аргумента: сам
unique_copy( ivec.begin(), ivec.end(),
контейнер и итератор, указывающий позицию, с которой должна начаться вставка:
inserter( vres ), vres.begin() );
* Итератор, указывающий на позицию начала вставки, сдвигается вперед после каждой вставки, так что элементы располагаются в нужном порядке, как если бы мы написали
vector int ::iterator iter = vres.begin(),
iter2 = ivec.begin();
for ( ; iter2 != ivec.end() ++ iter, ++iter2 )
vres.insert( iter, *iter2 );
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Мастер вставки картинки
Мастер вставки картинки Для добавления на веб-страницу графических изображений полезно использовать специальный механизм, вызываемый с помощью команды главного меню Инструменты ?
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не
Итераторы.
Итераторы. В Шагах 15 и 16 мы повозились с имитацией массива (коллекцией). Мы добились нормальной работы при чтении и записи в ячейки массива. Но работа с массивом этим не ограничивается. Вот захочется нам сделать что-то со всеми элементами массива, а он индексирован по
Итераторы
Итераторы На первый взгляд итераторы представляются предметом весьма простым. Но стоит присмотреться повнимательнее, и вы заметите, что стандартные контейнеры STL поддерживают четыре разных типа итераторов: iterator, const_iterator, reverse_iterator и const_reverse_iterator. Проходит совсем немного
2.2.5.2 Итераторы
2.2.5.2 Итераторы Итератор - это программный объект, который осуществляет итеративную (циклическую) обработку некоторого множества данных. Итераторы различаются типом производимой обработки, но имеют единообразный внешний интерфейс. Каждый итератор открывает один (или
Итераторы
Итераторы Итераторы - это обобщение указателей, которые позволяют программисту работать с различными структурами данных (контейнерами) единообразным способом. Чтобы создать шаблонные алгоритмы, которые правильно и эффективно работают с различными типами структур
ИТЕРАТОРЫ ПОТОКОВ
ИТЕРАТОРЫ ПОТОКОВ Чтобы шаблоны алгоритмов могли работать непосредственно с потоками ввода-вывода, предусмотрены соответствующие шаблонные классы, подобные итераторам. Например,partial_sum_copy(istream_iterator‹double›(cin), istream_iterator‹double›(), ostream_iterator‹double›(cout, " "));читает файл,
Итераторы вставки (Insert iterators)
Итераторы вставки (Insert iterators) Чтобы было возможно иметь дело с вставкой таким же образом, как с записью в массив, в библиотеке обеспечивается специальный вид адаптеров итераторов, называемых итераторами вставки (insert iterators). С обычными классами итераторовwhile (first!= last) *result++ =
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не
12.4.2. Обратные итераторы
12.4.2. Обратные итераторы Операции begin() и end() возвращают соответственно итераторы, указывающие на первый элемент и на элемент, расположенный за последним. Можно также вернуть обратный итератор, обходящий контейнер от последнего элемента к первому. Во всех контейнерах для
12.4.3. Потоковые итераторы
12.4.3. Потоковые итераторы Стандартная библиотека предоставляет средства для работы потоковых итераторов чтения и записи совместно со стандартными контейнерами и обобщенными алгоритмами. Класс istream_iterator поддерживает итераторные операции с классом istream или одним из
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не
Настройка параметров вставки изображений
Настройка параметров вставки изображений Нажатие кнопки открывает окно настройки параметров вставки изображений (рис. 9.7). Рис. 9.7. Окно настройки параметров вставки изображенийДля предварительного просмотра и определения местонахождения вставляемого изображения,
11.5.1. Определение порядка вставки столбцов
11.5.1. Определение порядка вставки столбцов Для иллюстрации процедуры вставки обратимся к следующим двум файлам, полученным путем применения команды cut к рассмотренному выше файлу pers.$ cat pas1ID897 ID667 ID9B2$ cat раs2P. Jones S. Round L. ClipПо умолчанию команда paste вставляет столбцы один за
У15.4 Итераторы фигур
У15.4 Итераторы фигур При обсуждении COMPOSITE_FIGURE мы говорили о применении итераторов для выполнения операций над составными фигурами. Разработайте соответтсвующие классы итераторов. (Подсказка: в [M 1994a] приведены классы библиотеки итераторов, которые послужат основой вашей