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

Herbert Schildt

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

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

*/

#include <iostream>

#include <list>

using namespace std;

int main()

{

 list<char> lst;

 list<char> revlst;

 int i;

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

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

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

 list<char>::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 <iostream>

#include <list>

#include <cstdlib>

using namespace std;

int main()

{

 list<int> lst;

 int i;

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

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

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

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

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

  cout << *p << " ";

  p++;

 }

 cout << endl << endl;

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

 lst.sort();

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

 p = lst.begin();

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

  cout << *p << " ";

  p++;

 }

 return 0;

}

Вот как может выглядеть один из возможных вариантов выполнения этой программы.

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

41 18467 6334 26500 19169 15724 11478 29358 26962 24464

Отсортированное содержимое списка:

41 6334 11478 15724 18467 19169 24464 26500 26962 29358

Объединение одного списка с другим

Один упорядоченный список можно объединить с другим. В результате мы получим упорядоченный список, который включает содержимое двух исходных списков. Новый список остается в вызывающем списке, а второй список становится пустым. В следующем примере выполняется слияние двух списков. Первый список содержит буквы ACEGI, а второй— буквы BDFHJ. Эти списки затем объединяются, в результате чего образуется упорядоченная последовательность букв ABCDEFGHIJ.