1.6. Алгоритм copy и итератор вставки
Мы можем использовать алгоритм сору для копирования элементов одного контейнера в другой, причем, например, источником может быть вектор, а приемником - список, как показывает следующая программа:
// copyl.cpp: Копируем вектор в список.
// Первая версия: режим замещения.
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int main()
{ int a[4] = {10, 20, 30, 40};
vector<int> v(a, a+4);
list<int> L(4); // Список из 4 элементов
copy (v. begin!) , v.endO, L. begin)));
list<int>::iterator i;
for (i=L.begin() ; i != L.endO; + + i)
cout « *i « " "; // Результат: 10 20 30 40
cout « endl;
return 0;
Режимы замещения и вставки
Поскольку в список L необходимо скопировать четыре элемента, при его определении ему задана длина 4:
list<int> L(4); // Список из 4 элементов.
Это необходимо, поскольку алгоритм сору, когда его используют таким способом, работает в режиме замещения. Это напоминает то, как вводятся символы с клавиатуры при наборе текста в режиме замещения. В этом режиме мы пишем поверх имеющегося текста; многие, однако, предпочитают режим вставки. На обычной клавиатуре клавиша Ins переключает режим вставки в режим замещения и обратно. Что касается алгоритма сору, то для него также не составит труда перейти в режим вставки. Попробуем начать с пустого списка, заменив вышеприведенное определение L на следующее:
list<int> L; // Пустой список.
Затем заменим вызов алгоритма сору на следующий:
copy (v. begin)) , v.endO, inserter(L, L.beginO));
С этими двумя изменениями программы содержимое списка L станет таким же, как и в изначальной версии. Новая запись
inserter)...)
зовется итератором вставки, который является особым видом адаптера итератора, о чем рассказано в разделе б.б. Мы можем также использовать его, чтобы вставить данные в середину последовательности, как показывает следующая версия:
// сору2.срр: Копируем вектор в список.
// Вторая версия: режим вставки.
#include <iostream> #include <vector> iinclude <list> using namespace std;
int main()
{ int a[4] = {10, 20, 30, 40};
vector<int> v(a, a+4);
list<int> L(5, 123); // Список из 5 элементов
<< назад вперед >>