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

Herbert Schildt

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

template <class Т, class Allocator = allocator<T>> 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<T, Allocator> &ob);

template <class InIter>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() два списка можно объединить и упорядочить результат.

Чтобы достичь максимальной гибкости и переносимости для любого объекта, который подлежит хранению в списке, следует определить конструктор по умолчанию и оператор "<" (и желательно другие операторы сравнения). Более точные требования к объекту (как к потенциальному элементу списка) необходимо согласовывать в соответствии с документацией на используемый вами компилятор.

Рассмотрим простой пример списка.

// Базовые операции, определенные для списка.

#include <iostream>

#include <list>

using namespace std;

int main()

{

 list<char> lst; // создание пустого списка

 int i;

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

 cout << "Размер = " << lst.size() << endl;

 cout << "Содержимое : ";

 list<char>::iterator p = lst.begin();

 while(p != lst.end()) {

  cout << *p;

  p++;

 }

 return 0;

}

Результаты выполнения этой программы таковы:

Размер = 10

Содержимое : ABCDEFGHIJ

При выполнении эта программа создает список символов. Сначала создается пустой объект списка. Затем в него помещается десять букв (от А до J). Заполнение списка реализуется путем использования функции push_back(), которая помещает каждое новое значение в конец существующего списка. После этого отображается размер списка и его содержимое. Содержимое списка выводится на экран в результате выполнения следующего кода.

list<char>::iterator р = lst.begin();

while(p != lst.end()) {

 cout << *p;

 p++;

}

Здесь итератор p инициализируется таким образом, чтобы он указывал на начало списка. При выполнении очередного прохода цикла итератор р инкрементируется, чтобы указывать на следующий элемент списка. Этот цикл завершается, когда итератор р указывает на конец списка. Применение подобных циклов — обычная практика при использовании библиотеки STL. Например, аналогичный цикл мы применили для отображения содержимого вектора в предыдущем разделе.