Класс map в языке CPP поддерживает поддерживает ассоциативный контейнер (т.е. ключ может быть строкой), в котором уникальным ключам соответствуют определённые значения.
Этот класс предназначен для быстрого поиска значения по ключу. В качестве ключа может быть использовано все, что угодно, но при этом необходимо помнить, что главной особенностью ключа является возможность применить к нему операцию сравнения. Быстрый поиск значения по ключу осуществляется благодаря тому, что пары хранятся в отсортированном виде. Этот класс имеет недостаток - скорость вставки новой пары обратно пропорциональна количеству элементов, сохраненных в классе. Еще один важный момент - ключ должен быть уникальным.
Спецификация его шаблона имеет следующий вид:
template <class Key, class T, class Comp = less<key>, class Allocator =Allocator<pair<const key, T>>> class map
Здесь key - тип данных ключей,T - тип сохраняемых (отображемых)значений, а Comp - функция, которая сравнивает два ключа. Класс map имеет следующие конструкторы:
explicit map(const Comp &cmpfn = Comp(),Allocator &a = Allocator()); map(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 (и если она задана), определяет упорядочение отображения.
Для класса map определены следующие операторы сравнения:
== < <= != > >=
Класс map содержит перечисленные ниже функции-члены. В приведенных описаниях элемент key_type представляет тип ключа, а элемент value_type - пару элементов pair<Key, T>.
iterator begin();
const_iterator begin() const; Возвращает итератор для первого элемента в отображении.
void clear();
Удаляет все элементы из отображения.
size_type count(const key_type &k) const;
Возвращает число вхождений ключа k в отображении (1 или 0).
bool empty() const;
Возвращает значение true, если данное отображение пустое, и false в противном случае.
const_iterator end() const;
iterator end();
Возвращает итератор, указывающий на конец отображения.
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; Возвращает объект-функцию, которая сравнивает значения.
Листинг применения класса map С++:
#include <iostream> #include <vector> #include <map> using namespace std; int main(){ const int SIZE=20; typedef pair <int, int> Int_Pair; map <int, int>::iterator m1_Iter; map <int, int, less<int> > m1; m1.insert( Int_Pair( 1, 10 ) ); m1.insert( Int_Pair( 2, 20 ) ); m1.insert( Int_Pair( 3, 30 ) ); m1.insert( Int_Pair( 4, 40 ) ); m1.insert( Int_Pair( 9, 80 ) ); m1.insert( Int_Pair( 9, 90 ) ); //insert принимает ТИП, то есть ему нужно создать пару ключ -значение m1.insert( pair<int,int>( 5, 50 ) ); cout << "m1 =\n"; for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ ){ cout << " first " << m1_Iter->first<<" second "<<m1_Iter -> second<<"\n"; } //key STROKA cout << endl; cout << "key STROKA"<< endl; map <char*, int > m2; map <char*, int>::iterator m2_Iter; char str[] = "test key stroka string"; m2.insert( pair<char*,int>( str, 777 ) ); for ( m2_Iter = m2.begin( ); m2_Iter != m2.end( ); m2_Iter++ ){ cout << " first " << m2_Iter->first<<"\n"; cout << " " << m2_Iter -> second; } cout << endl; return 0; }