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

Herbert Schildt

 list<myclass> lst1;

 for(i=0; i <10; i++) lst1.push_back(myclass(i, i));

 cout << "Первый список: ";

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

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

  cout << p->getsum() << " ";

  p++;

 }

 cout << endl;

 // Создание второго списка.

 list<myclass> lst2;

 for(i=0; i<10; i++) lst2.push_back(myclass(i*2, i*3));

 cout << "Второй список: ";

 p = lst2.begin();

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

  cout << p->getsum() << " ";

  p++;

 }

 cout << endl;

 // Теперь объединяем списки lst1 и lst2.

  lst1.merge(lst2);

 // Отображаем объединенный список.

 cout << "Объединенный список: ";

 р = lst1.begin();

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

  cout << p->getsum() << " ";

  p++;

 }

 return 0;

}

Эта программа создает два списка объектов типа myclass и отображает их содержимое. Затем выполняется объединение этих двух списков с последующим отображением нового содержимого результирующего списка. Итак, программа генерирует такие результаты.

Первый список: 0 2 4 6 8 10 12 14 16 18

Второй список: 0 5 10 15 20 25 30 35 40 45

Объединенный список: 0 0 2 4 5 6 8 10 10 12 14 15 16 18 20 25 30 35 40 45

Отображения 

Отображениеэто ассоциативный контейнер.

Класс map поддерживает ассоциативный контейнер, в котором уникальным ключам соответствуют определенные значения. По сути, ключ — это просто имя, которое присвоено некоторому значению. После того как значение сохранено в контейнере, к нему можно получить доступ, используя его ключ. Таким образом, в самом широком смысле отображение — это список пар "ключ-значение". Если нам известен ключ, мы можем легко найти значение. Например, мы могли бы определить отображение, в котором в качестве ключа используется имя человека, а в качестве значения — его телефонный номер. Ассоциативные контейнеры становятся все более популярными в программировании.

Как упоминалось выше, отображение может хранить только уникальные ключи. Ключи-дубликаты не разрешены. Чтобы создать отображение, которое бы позволяло хранить неуникапьные ключи, используйте класс multimap.

Контейнер map имеет следующую шаблонную спецификацию.

template <class Key, class T, class Comp = less<Key>, class Allocator =allocator<pair<const Key, T> > >class map

Здесь Key— тип данных ключей, T— тип сохраняемых (отображаемых) значений, а Comp — функция, которая сравнивает два ключа. По умолчанию в качестве функции сравнения используется стандартная функция-объект less. Элемент Allocator означает распределитель памяти, который по умолчанию использует стандартный распределитель allocator.

Класс map имеет следующие конструкторы.

explicit map(const Comp &cmpfn = Comp(), const Allocator &a = Allocator());

map(const map<Key, T, Comp, Allocator> &ob);

template <class InIter> map(InIter start, InIter end, const Comp &cmpfn = Comp(), const Allocator &a = Allocator());

Первая форма конструктора создает пустое отображение. Вторая предназначена для создания отображения, которое содержит те же элементы, что и отображение ob. Третья создает отображение, которое содержит элементы в диапазоне, заданном итераторами start и end. Функция, заданная параметром cmpfn (если она задана), определяет характер упорядочения отображения.