Шаг 56.
Библиотека STL.
Вспомогательные средства. Пары

    На этом шаге мы рассмотрим использование типа pair.

    Тип pair позволяет работать с двумя величинами как с единым целым. Он неоднократно встречается в стандартной библиотеке C++. В частности, классы контейнеров map и multimap используют тип pair при выполнении операций с элементами, которые представляют собой пары "ключ/значение". Другой распространенный пример - функция, возвращающая два значения.

    Структура pair определяется в заголовочном файле <utility> следующим образом:

namespace std {
  template <class T1, class T2> 
  struct pair {
    // Имена типов компонентов
    typedef T1 firstType;
    typedef T2 secondType;
    // Компоненты 
    T1 first; 
    T2 second;
    // Конструктор по умолчанию - вызовы Т1() и Т2()
    // обеспечивают инициализацию базовых типов
    pair() : first(T1()), second(T2())  {}
    // Конструктор с двумя значениями 
    pair(const T1& a, const T2& b) : first(a), second(b) {}
    // Копирующий конструктор с автоматическими преобразованиями 
    template<class U, class V> 
    pair (const pair<U, V> &p) : first(p.first), second(p.second) {}
};
// Сравнения
template <class T1, class T2>
bool operator== (const pair<T1.T2>&. const pair<T1,.T2>&):
template <class T1, class T2>
bool operator< (const pair<T1,T2>&. const pair<T1,T2>&);
.    .    . // И т.д для !=, <=. >, >=
template <class T1, class T2> 
pair <T1, T2> make_pair(const T1&, const T2&); 

    Обратите внимание: тип объявляется с ключевым словом struct вместо class, а все его члены объявляются открытыми. Следовательно, для любой пары значений возможны прямые обращения к отдельным компонентам.

    Конструктор по умолчанию создает пару значений, инициализируемых конструкторами по умолчанию соответствующих типов. Согласно правилам языка, явный вызов конструктора по умолчанию также инициализирует базовые типы данных (такие, как int), поэтому следующее объявление инициализирует компоненты р конструкторами int() и float(), что приводит к обнулению обеих переменных:

  std::pair<int,float> p;     // p.first и p.second инициализируется нулями

    Инициализация базовых типов вызовом конструктора по умолчанию описана на шаге 30.

    Шаблонная версия конструктора используется о ситуациях, требующих автоматического преобразования типов. При копировании объекта типа pair вызывается стандартный копирующий конструктор, сгенерированный по обычным правилам. Пример:

  void f(std::pair<int,const char*>);
  void g(std::pair<const int,std::string>):
  .    .    .    .
  void foo {
    std::pair<int,const char*> p(42,"hello");
    f(p):   // OK: вызывается стандартный копирующий конструктор
    g(p);  // OK: вызывается шаблонный конструктор
  }

    На следующем шаге мы рассмотрим парные сравнения.




Предыдущий шаг Содержание Следующий шаг