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



 

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

 

 

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

 

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

 

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

 

 

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

 

Отображения

 

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

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

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

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

 

 

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

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

 

 

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

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

Для класса map определены следующие операторы сравнения:

 

 

Функции‑члены, определенные для класса map , представлены в табл. 21.4. В их описании под элементом key_type понимается тип ключа, а под элементом value_type – значение выражения pair<Key, Т> .

 

 

 

 

 

 

 

 

 

 

 

 

Пары "ключ‑значение" хранятся в отображении как объекты класса pair , который имеет следующую шаблонную спецификацию.

 

 

Как отмечено в комментариях, член first содержит ключ, а член second – значение, соответствующее этому ключу.

Создать пару "ключ‑значение" можно либо с помощью конструкторов класса pair , либо путем вызова функции make_pair() , которая создает парный объект на основе типов данных, используемых в качестве параметров. Функция make_pair() – это обобщенная функция, прототип которой имеет следующий вид.

 

 

Как видите, функция make_pair() возвращает парный объект, состоящий из значений, типы которых заданы параметрами Ktype и Vtype . Преимущество использования функции make_pair() состоит в том, что типы объектов, объединяемых в пару, определяются автоматически компилятором, а не явно задаются программистом.

Возможности использования отображения демонстрируется в следующей программе. В данном случае в отображении сохраняется 10 пар "ключ‑значение". Ключом служит символ, а значением – целое число. Пары "ключ‑значение" хранятся следующим образом:

 

 

и т.д. После сохранения пар в отображении пользователю предлагается ввести ключ (т.е. букву из диапазона А‑J ), после чего выводится значение, связанное с этим ключом.

 

 

Обратите внимание на использование шаблонного класса pair для построения пар "ключ‑значение". Типы данных, задаваемые pair ‑выражением, должны соответствовать типам отображения, в которое вставляются эти пары.

После инициализации отображения ключами и значениями можно выполнять поиск значения по заданному ключу, используя функцию find() . Эта функция возвращает итератор, который указывает на нужный элемент или на конец отображения, если заданный ключ не был найден. При обнаружении совпадения значение, связанное с ключом, можно найти в члене second парного объекта типа pair .

В предыдущем примере пары "ключ‑значение" создавались явным образом с помощью шаблона pair<char, int> . И хотя в этом нет ничего неправильного, зачастую проще использовать с этой целью функцию make_pair() , которая создает pair ‑объект на основе типов данных, используемых в качестве параметров. Например, эта строка кода также позволит вставить в отображение m пары "ключ‑значение" (при использовании предыдущей программы):

 

 

Здесь, как видите, выполняется операция приведения к типу char , которая необходима для переопределения автоматического преобразования в тип int результата сложения значения i с символом 'А' .

 


Дата добавления: 2018-09-22; просмотров: 307; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!