Итераторы вставки (Insert iterators)
Итераторы вставки (Insert iterators)
Чтобы было возможно иметь дело с вставкой таким же образом, как с записью в массив, в библиотеке обеспечивается специальный вид адаптеров итераторов, называемых итераторами вставки (insert iterators). С обычными классами итераторов
while (first!= last) *result++ = *first++;
вызывает копирование диапазона [first, last) в диапазон, начинающийся с result. Тот же самый код с result, являющимся итератором вставки, вставит соответствующие элементы в контейнер. Такой механизм позволяет всем алгоритмам копирования в библиотеке работать в режиме вставки (insert mode) вместо обычного режима наложения записей.
Итератор вставки создаётся из контейнера и, возможно, одного из его итераторов, указывающих, где вставка происходит, если это ни в начале, ни в конце контейнера. Итераторы вставки удовлетворяют требованиям итераторов вывода. operator* возвращает непосредственно сам итератор вставки. Присваивание operator=(const T& х) определено для итераторов вставки, чтобы разрешить запись в них, оно вставляет х прямо перед позицией, куда итератор вставки указывает. Другими словами, итератор вставки подобен курсору, указывающему в контейнер, где происходит вставка. back_insert_iterator вставляет элементы в конце контейнера, front_insert_iterator вставляет элементы в начале контейнера, а insert_iterator вставляет элементы, куда итератор указывает в контейнере. back_inserter, front_inserter и inserter - три функции, создающие итераторы вставки из контейнера.
template ‹class Container›
class back_insert_iterator: public output_iterator {
protected:
Container& container;
public:
back_insert_iterator(Container& x): container(x) {}
back_insert_iterator ‹Container›& operator=(const Container::value_type& value) {
container.push_back(value);
return *this;
}
back_insert_iterator‹Container›& operator*() {return *this;}
back_insert_iterator‹Container›& operator++() {return *this;}
back_insert_iterator‹Container›& operator++(int) {return *this;}
};
template ‹class Container›
back_insert_iterator‹Container› back_inserter(Container& x) {
return back_insert_iterator‹Container›(x);
}
template ‹class Container›
class front_insert_iterator: public output_iterator {
protected:
Container& container;
public:
front_insert_iterator(Container& x): container (x) {}
front_insert_iterator‹Container›& operator=(const Container::value_type& value) {
container.push_front(value);
return *this;
}
front_insert_iterator‹Container›& operator*() {return *this;}
front_insert_iterator‹Container›& operator++() {return *this;}
front_insert_iterator‹Container›& operator++(int) {return *this;}
};
template ‹class Container›
front_insert_iterator‹Container› front_inserter(Container& x) {
return front_insert_iterator‹Container›(х);
}
template ‹class Container›
class insert_iterator: public output_iterator {
protected:
Container& container;
Container::iterator iter;
public:
insert_iterator(Container& x, Container::iterator i) : container (x), iter(i) {}
insert_iterator‹Container›& operator=(const Container::value_type& value) {
iter = container.insert(iter, value);
++iter;
return *this;
}
insert_iterator‹Container›& operator*() {return *this;}
insert_iterator‹Container›& operator++() {return *this;}
insert_iterator‹Container›& operator++(int) {return *this;}
};
template ‹class Container, class Iterator›
insert_iterator<Container› inserter(Container& x, Iterator i) {
return insert_iterator‹Container›(x, Container::iterator(i));
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Мастер вставки картинки
Мастер вставки картинки Для добавления на веб-страницу графических изображений полезно использовать специальный механизм, вызываемый с помощью команды главного меню Инструменты ?
Инструкция INSERT INTO ... FROM ... UNION ...
Инструкция INSERT INTO ... FROM ... UNION ... Сервер Yaffil, в отличие от InterBase/Firebird, позволяет использовать объединения UNION для формирования данных на вставку. Пример:insert into t_a (id) select b.id from b union select с.id from
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не
INSERT
INSERT INSERT INTO < table name> [(<column name> .,. ] { VALUES ( <value expression> .,.. ) } |
Итераторы ввода (Input iterators)
Итераторы ввода (Input iterators) Класс или встроенный тип X удовлетворяет требованиям итератора ввода для значимого типа T, если справедливы следующие выражения:Таблица 2. Требования итератора ввода выражение возвращаемый тип семантика исполнения утверждение/примечание
Итераторы вывода (Output iterators)
Итераторы вывода (Output iterators) Класс или встроенный тип X удовлетворяет требованиям итератора вывода, если справедливы следующие выражения:Таблица 3. Требования итератора вывода выражение возвращаемый тип семантика исполнения утверждение/примечание состояние до/после
Последовательные итераторы (Forward iterators)
Последовательные итераторы (Forward iterators) Класс или встроенный тип X удовлетворяет требованиям последовательного итератора, если справедливы следующие выражения:Таблица 4. Требования последовательного итератора выражение возвращаемый тип семантика исполнения
Двунаправленные итераторы (Bidirectional iterators)
Двунаправленные итераторы (Bidirectional iterators) Класс или встроенный тип X удовлетворяет требованиям двунаправленного итератора, если к таблице, которая определяет последовательные итераторы, мы добавим следующие строки:Таблица 5. Требования двунаправленного итератора (в
Итераторы произвольного доступа (Random access iterators)
Итераторы произвольного доступа (Random access iterators) Класс или встроенный тип X удовлетворяет требованиям итераторов произвольного доступа, если к таблице, которая определяет двунаправленные итераторы, мы добавим следующие строки:Таблица 6: Требования итератора
Обратные итераторы (Reverse iterators)
Обратные итераторы (Reverse iterators) Двунаправленные итераторы и итераторы произвольного доступа имеют соответствующие адаптеры обратных итераторов, которые выполняют итерации через структуру данных в противоположном направлении.Они имеют те же самые сигнатуры, как и
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не
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() );Проблема
Точка вставки
Точка вставки Snap to Insert – привязка к точке вставки блока, формы, текста, атрибута (содержащего информацию о блоке) или определения атрибута (задающего характеристики атрибута).При выборе атрибута, входящего в блок, AutoCAD производит привязку к точке вставки атрибута, а не