Шаг 14.
Библиотека STL.
Отображения

    На этом шаге мы приведем общие сведения об отображениях.

    Класс 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. Третья создает отображение, которое содержит те же элементы, что и отображение ob. Третья создает отображение, которое содержит элементы в диапазоне, заданном итераторами start и end. Функция, заданная параметром cmpfn (если она задана), определяет характер упорядочения отображения.

    Для класса map определены следующие операторы сравнения: ==, <, <=, !=, > и >=.

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

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

   template <class Ktype, class Vtype> struct pair {
        typedef Ktype first_type; // тип ключа
        typedef Vtype second_type; // тип значения
        Ktype first; // содержит значение
        Vtype second; // содержит ключ
         // Конструкторы
         pair();
         pair (const Ktype &k, const Vtype &v);
         template<class A, class B> pair (const<A, B> &ob);
}

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

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

  template <class Ktype, class Vtype>
       pair<Ktype, Vtype> make_pair(const Ktype &k, const Vtyep &v);

Таблица 1. Функции-члены, определенные для класса map
Функция-член Назначение
iterator begin();
const_iterator begin() const;
Возвращает итератор для первого элемента в отображении
void clear(); Удаляет все элементы из отображения
size_type count(const key_type &k) const; Возвращает число вхождений ключа k в отображении (1 или 0)
bool empty() const; Возвращает значение true, если данное отображение пустое, и значение false в противном случае
iterator end();
const_iterator end() const;
Возвращает итератор, указывающий на конец отображения
pair<iterator, iterator> equal_range(const key_type &k);
pair<const_iterator, const_iterator>
equal_range(const key_type &k) const;
Возвращает пару итераторов, которые указывают на первый и последний элементы в отображении, содержащие заданный ключ
void erase(iterator i); Удаляет элемент, на который указывает итератор i
void erase(iterator start, iterator end); Удаляет элементы в диапазоне, заданном параметрами start и end
size_type erase(const key_type &k); Удаляет из отображения элементы, ключи которых имеют значение k
iterator find( const key_type &k);
const_iterator find( const key_type &k) const;
Возвращает итератор, соответствующий заданному ключу. Если такой ключ не обнаружен, возвращает итератор, соответствующий концу отображения
allocator_type get_allocator() const; Возвращает распределитель памяти отображения
iterator insert( iterator i, const value_type &val); Вставляет значение val в позицию элемента (или после него), заданного итератором i. Возвращает итератор, указывающий на этот элемент
template <class InIter>
void insert(InIter start, InIter end);
Вставляет элементы заданного диапазона
pair<iterator, bool>
insert( const value_type &val);
Вставляет значение val в вызывающее отображение. Возвращает итератор, указывающий на этот элемент. Элемент вставляется только в том случае, если его еще нет в отображении. Если элемент был вставлен, возвращает значение pair<iterator, true>, в противном случае - значение pair<iterator, false>
key_compare key_comp() const; Возвращает объект-функцию, которая сравнивает ключи
iterator lower_bound( const key_type &k);
const_iterator lower_bound( const key_type &k) const;
Возвращает итератор для первого элемента в отображении, ключ которого равен значению k или больше этого значения
size_type max_size() const; Возвращает максимальное число элементов, которое может содержать данное отображение
reference operator[]( const key_type &i); Возвращает ссылку на элемент, заданный параметром i. Если этого элемента не существует, вставляет его в отображение
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
Возвращает реверсивный итератор, соответствующий концу отображения
reverse_iterator rend();
const_reverse_iterator rend() const;
Возвращает реверсивный итератор, соответствующий началу отображения
size_type size() const; Возвращает текущее число элементов в отображении
void swap(map<Key, T, Comp, Allocator> &ob); Выполняет обмен элементами вызывающего отображения и отображения ob
iterator upper_bound (const key_type &k);
const_iterator upper_bound(const key_type &k) const;
Возвращает итератор для первого элемента в отображении, ключ которого больше заданного значения k
value_compare value_comp() const; Возвращает объект-функцию, которая сравнивает значения

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




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