Программирование >>  Немодифицирующие последовательные алгоритмы 

1 ... 17 18 19 [ 20 ] 21 22 23 ... 78


2.8. Пары и сравнения

Чтобы использовать словари и словари с дубликатами более интересным способом, нам нужно познакомиться с шаблонным классомршг (пара), который полезен также и для других целей. Этот класс использует следующая программа:

pairs.срр: Операции с парами, ♦include <iostream> ♦include <utility>

using namespace std; int mainO

( pair<int, double> P(123, 4.5), Q = P; Q = make pair(122, 4.5);

cout P: P.first P.second endl; cout Q: Q.first Q.second endl; if (P > Q) cout P > Q\n ; ++Q.first;

cout After ++Q.first: ; if (P == Q) cout P == Q\n ; return 0;

Большинство программ, использующих STL, будут содержать строчку Mnclude для заголовка, который уже включает внутри себя utility. Например, если в нашей программе есть строчка include <vector>, не нужно добавлять Mnclude <utility>.

Как показывает эта программа, шаблон pair имеет два параметра, представляющих собой типы членов структуры pair: first и second. Конструктор для pair, используемый для инициализации Р, получает два начальных значения для этих членов. У структуры pair нет конструктора по умолчанию; другими словами, нельзя написать

pair<int, double> Р; ошибка

Вместо того чтобы явным образом передавать два значения конструктору, как это сделано для Р, мы можем использовать уже существующую пару, как показано выше при определении Q.

Определив Q, можно было бы присвоить этой переменной другое значение, написав

Q = pair<int, double>(122, 4.5); Вместо этого мы воспользовались более короткой записью Q = make pair(122, 4.5);



эквивалентной по своему действию. Для любых двух пар Ри Qзначения выражений Р == Q и Р < Q и т. п. согласуются с хорошо известным лексикографическим порядком, как показывают следующие примеры:

(122, 5.5) < (123, 4.5) (123, 4.5) < (123, 5.5) (123, 4.5) == (123, 4.5)

В программе ршг5.срр сначала мы имеем Р> Q, но после увеличения Q.first на единицу PnQсравняются, как показывает вывод:

Р: 123 4.5 Q: 122 4.5

Р > Q

After ++Q.first: Р == Q

Сравнения

Когда мы пишем операторы сравнения для наших собственных типов, нам необходимо определить только == и <. Четыре остающихся оператора !=, >, <= и >= автоматически определяются в STL с помощью следующих четырех шаблонов:

template <class Tl, class Т2>

inline bool operator!=(const Tl &x, const T2 &y)

{ return !(x == y);

template <class Tl, class T2>

inline bool operator>(const Tl &x, const T2 &y)

{ return у < X;

template <class Tl, class T2>

inline bool operator<=(const Tl &x, const T2 &y)

{ return !{ у < x);

template <class Tl, class T2>

inline bool operator>=(const Tl &x, const T2 &y)

{ return !(x < y);

Как видно из примера, эти четыре достаточно общих шаблона определяют !=, >, <= и >= через == и <. Нам не нужно писать эти шаблоны самостоятельно, поскольку они находятся в заголовке functional, который включается по умолчанию всякий раз, когда мы используем STL.



2.9. Снова словари

Поскольку словарь содержит пары {k, d), где k является ключом, а - сопутствующими данными, можно предположить, что шаблон pair будет полезен при работе со словарями. Как и для последовательного контейнера, для ассоциативного контейнера мы можем использовать итератор г; в этом случае выражение *i будет обозначать пару, в которой (*i).first является ключом, а (*i).second - сопутствующими данными. Например, с помощью итератора i для словаря из раздела 2.7 напечатаем все содержимое словаря (ключи в восходящем порядке), применив следующий цикла for.

for (i = D.beginO; i != D.endO; i + + ) cout setw(9)

(*i) . second (*i).first endl;

Заметим, что здесь мы выводим (*i)second перед {*i).first, так что не нужно планировать, сколько позиций зарезервировать для имен в выводе вроде

54321 Papadimitrou, С. 12345 Smith, J.

С таким форматом также удобнее работать при вводе, поскольку в этом случае мы можем прочесть число, пробел и текст до конца строки. Но следует помнить, что этот текст является ключом, хотя и расположен в конце строки.

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

Пример команды Значение

?Johnson, J. Показать телефонный номер абонентаУо/ги50И,у.

/Johnson, J. Удалить запись об абоненте/о/гиои,/из книги

!66331 Peterson, К. Добавить абонента Peterson, К с номером 66331

* Показать всю телефонную книгу Записать телефонную книгу в файл phone.txt

# Выход



1 ... 17 18 19 [ 20 ] 21 22 23 ... 78

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика