Читать «C++: базовый курс» онлайн - страница 310

Herbert Schildt

О пользе итераторов

Частично сила библиотеки STL обусловлена тем, что многие ее функции используют итераторы. Этот факт позволяет выполнять операции с двумя контейнерами одновременно. Рассмотрим, например, такой формат векторной функции insert().

template <class InIter>

void insert(iterator i, InIter start, InIter end);

Эта функция вставляет исходную последовательность, определенную параметрами start и end, в приемную последовательность, начиная с позиции i. При этом нет никаких требований, чтобы итератор i относился к тому же вектору, с которым связаны итераторы start и end. Таким образом, используя эту версию функции insert(), можно один вектор вставить в другой. Рассмотрим пример.

// Вставляем один вектор в другой.

#include <iostream>

#include <vector>

using namespace std;

int main()

{

 vector<char> v, v2;

 unsigned int i;

 for(i=0; i<10; i++) v.push_back('A' + i);

 // Отображаем исходное содержимое вектора.

 cout << "Исходное содержимое вектора:\n";

 for(i=0; i<v.size(); i++)

  cout << v[i] << " ";

 cout << endl << endl;

 // Инициализируем второй вектор.

 char str[] = "-STL — это сила!-";

 for(i=0; str[i]; i++) v2 .push_back (str [i]);

 /* Получаем итераторы для середины вектора v, а также начала и конца вектора v2. */

 vector<char>::iterator р = v.begin()+5;

 <char>::iterator p2start = v2.begin();

 vector<char>::iterator p2end = v2.end();

 // Вставляем вектор v2 в вектор v.

 v.insert(p, p2start, p2end);

 // Отображаем результат вставки.

 cout << "Содержимое вектора v после вставки:\n";

 for(i=0; i<v.size(); i++) cout << v[i] << " ";

 return 0;

}

При выполнении эта программа генерирует следующие результаты.

Исходное содержимое вектора:

A B C D E F G H I J

Содержимое вектора v после вставки:

A B C D E - S T L -- это cилa! - F G H I J

Как видите, содержимое вектора v2 вставлено в середину вектора v.

По мере дальнейшего изучения возможностей, предоставляемых STL, вы узнаете, что итераторы являются связующими средствами, которые делают библиотеку единым целым. Они позволяют работать с двумя (и больше) объектами STL одновременно, но особенно полезны при использовании алгоритмов, описанных ниже в этой главе.

Списки

Списокэто контейнер с двунаправленным последовательным доступом к его элементам.

Класс list поддерживает функционирование двунаправленного линейного списка. В отличие от вектора, в котором реализована поддержка произвольного доступа, список позволяет получать к своим элементам только последовательный доступ. Двунаправленность списка означает, что доступ к его элементам возможен в двух направлениях: от начала к концу и от конца к началу.