Глава 18. Классы-контейнеры 501

cout « " Посередине находится студент " « students[students.size()/2] « endl;

return 0;

}

Список

Список библиотеки STL — это двунаправленный список. Каждый узел списка содержит элемент данных и два указателя: один на предыдущий и один на следующий узел. Такая структура данных отличается от организации векторов или двусторонних очередей. Вектор хорош, когда размер контейнера достаточно устойчив и элементы добавляются в конец и удаляются из конца последовательности. Добавление и удаление элементов из середины обходится дорого. Двусторонние очереди позволяют эффективно добавлять и удалять элементы с обоих концов контейнера, но они неэффективны при вставке в середину последовательности. Список наиболее эффективен, когда число элементов неизвестно и когда элементы необходимо добавлять и удалять из середины последовательности. За исключением этой возможности, векторы и двусторонние очереди более эффективны.

Контейнеры-списки пригодны для двунаправленных итераторов, но не для итераторов произвольного доступа, как в векторах и двусторонних очередях. Произвольный доступ к элементам с помощью операции [ ] отсутствует.

Для объектов, хранимых в списках, должны быть определены конструктор по умолчанию, конструктор копий и деструктор. Основные типы данных удовлетворяют этим условиям. Классы, определяемые пользователем, должны использовать конструкторы и деструкторы, генерируемые компилятором или определенные создателем класса. В случае, если класс содержит динамически размещаемые переменные, они должны быть определены явно.

Для использования списков в исходный код необходимо включить файл \Bc5\Include\list.h. Список объектов STUDENT (см. листинг 18.16) можно объявить одним из следующих способов:

// Пустой список. iist<STUDEMT> studentLi.st.1;

// Список из 10 предопределенных объектов STUDENT. list<STUDENT> studentl,ist2(10) ;

// Список из 10 копий объекта STUDENT Abel Stone. list<STUDENT> studentList3(10, STUDENT("Abel Stone",2.9));

// Конструктор копий.

list<STODENT> studentList4(studentList3);

// Вектор из 100 копий STUDENT John Newton

vector<STUDENT> studentVector(100, STUDENT("John Newton",3.6));

// Копирование первых 50 элементов типа STUDENT из studentVector

// в studentListS.

list<STUOENT> studentListS(student Vector.begin(), studentVector.begin()+50) ;