Выбрать главу

 }

 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.

// Слияние двух списков.

#include <iostream>

#include <list>

using namespace std;

int main()

{

 list<char> lst1, lst2;

 int i;

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

 for(i=1; i<11; i+=2) lst2.push_back('A'+i);

 cout << "Содержимое списка lst1: ";

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

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

  cout << *p;

  p++;

 }

 cout << endl << endl;

 cout << "Содержимое списка lst2: ";

 р = lst2.begin();

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

  cout << *p;

  p++;

 }

 cout << endl << endl;

 // Теперь сливаем эти два списка.

 lst1.merge(lst2);

 if(lst2.empty())

  cout << "Список lst2 теперь пуст.\n";

 cout << "Содержимое списка lst1 после объединения:\n";

 р = lst1.begin();

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

  cout << *p;

  p++;

 }

 return 0;

}

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

Содержимое списка lst1: ACEGI

Содержимое списка lst2: BDFHJ

Список lst2 теперь пуст.

Содержимое списка lst1 после объединения:

ABCDEFGHIJ

Хранение в списке объектов класса

Рассмотрим пример, в котором список используется для хранения объектов типа myclass. Обратите внимание на то, что для объектов типа myclass перегружены операторы "<", ">", "!=" и "==". (Для некоторых компиляторов может оказаться излишним определение всех этих операторов или же придется добавить некоторые другие.) В библиотеке STL эти функции используются для определения упорядочения и равенства объектов в контейнере. Несмотря на то что список не является упорядоченным контейнером, необходимо иметь средство сравнения элементов, которое применяется при их поиске, сортировке или объединении.

// Хранение в списке объектов класса.

#include <iostream>

#include <list>

#include <cstring>

using namespace std;

class myclass {

  int a, b;

  int sum;

 public:

  myclass() { a = b = 0; }

  myclass(int i, int j) {

   a = i;

   b = j;

   sum = a + b;

  }

  int getsum() { return sum; }

  friend bool operator<(const myclass &o1, const myclass &o2);

  friend bool operator>(const myclass &o1, const myclass &o2);

  friend bool operator==(const myclass &o1, const myclass &o2);

  friend bool operator!=(const myclass &o1, const myclass &o2);

};

bool operator<(const myclass &o1, const myclass &o2)