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

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

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

#include

#include

using namespace std;

int main()

{

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

 int i;

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

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

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

 list::iterator p = lst.begin();

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

  cout << *p;

  p++;

 }

 return 0;

}

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

Размер = 10

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

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

list::iterator р = lst.begin();

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

 cout << *p;

 p++;

}

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

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

/* Элементы можно помещать в список как с начала, так и с конца.

*/

#include

#include

using namespace std;

int main()

{

 list lst;

 list revlst;

 int i;

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

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

 cout << "Исходное содержимое списка: ";

 list::iterator p;

 /* Удаляем элементы из списка lst и помещаем их в список revlst в обратном порядке. */

 while(!lst.empty()) {

  р = lst.begin();

  cout << *р;

  revlst.push_front(*р);

  lst.pop_front();

 }

 cout << endl << endl;

 cout << "Размер списка revlst = ";

 cout << revlst.size() << endl;

 cout << "Реверсированное содержимое списка: ";

 p = revlst.begin();

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

  cout << *p;

  p++;

 }

 return 0;

}

Эта программа генерирует такие результаты.

Размер списка lst = 10

Исходное содержимое списка: ABCDEFGHIJ

Размер списка revlst = 10

Реверсированное содержимое списка: JIHGFEDCBA

В этой программе список реверсируется путем удаления элементов с начала списка lst и занесения их в начало списка revlst.

Сортировка списка

Список можно отсортировать с помощью функции-члена sort(). При выполнении следующей программы создается список случайно выбранных целых чисел, который затем упорядочивается по возрастанию.

// Сортировка списка.

#include

#include

#include

using namespace std;

int main()

{

 list lst;

 int i;

 // Создание списка случайно выбранных целых чисел.

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

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

 list::iterator p = lst.begin();

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

  cout << *p << " ";

  p++;

 }

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

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

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