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 элементов


<< назад вперед >>