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

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

#include

#include

using namespace std;

int main()

{

 vector v, v2;

 unsigned int i;

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

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

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

 for(i=0; i

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

 cout << endl << endl;

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

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

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

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

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

 ::iterator p2start = v2.begin();

 vector::iterator p2end = v2.end();

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

 v.insert(p, p2start, p2end);

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

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

 for(i=0; 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 поддерживает функционирование двунаправленного линейного списка. В отличие от вектора, в котором реализована поддержка произвольного доступа, список позволяет получать к своим элементам только последовательный доступ. Двунаправленность списка означает, что доступ к его элементам возможен в двух направлениях: от начала к концу и от конца к началу.

Шаблонная спецификация класса list выглядит следующим образом.

template > class list

Здесь T — тип данных, сохраняемых в списке, а элемент Allocator означает распределитель памяти, который по умолчанию использует стандартный распределитель. В классе list определены следующие конструкторы.

explicit list(const Allocator &а = Allocator() );

explicit list(size_type num, const T &val = T(), const Allocator &a = Allocator());

list(const list &ob);

template list(InIter start, InIter end, const Allocator &a = Allocator());

Конструктор, представленный в первой форме, создает пустой список. Вторая форма предназначена для создания списка, который содержит num элементов со значением val. Третья создает список, который содержит те же элементы, что и объект ob. Четвертая создает список, который содержит элементы в диапазоне, заданном параметрами start и end.

Для класса list определены следующие операторы сравнения:

==, <, <=, !=, > и >=

Функции-члены, определенные в классе list, перечислены в табл. 21.3. В конец списка, как и в конец вектора, элементы можно помещать с помощью функции push_back(), но с помощью функции push_front() можно помещать элементы в начало списка. Элемент можно также вставить и в середину списка, для этого используется функция insert(). Один список можно поместить в другой, используя функцию splice(). А с помощью функции merge() два списка можно объединить и упорядочить результат.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги