Шаблонний клас std::map, являється контейнером бібліотеки STL і призначений для утримування послідовності пар ключ-дані з унікальним і єдиним значенням ключа. Зазвичай, даний контейнер реалізовують у вигляді бінарного дерева. Оголошення класу виглядає приблизно наступним чином:
template < class Key,
           class T,
           class Compare = less<Key>,    
           class Alloc = allocator<pair<const Key,T> >
         > class map ;
Параметр шаблону Key призначений для вказування типу даних, який утримує значення ключа. Параметр T призначений для вказування типу, який буде містити дані. Параметр Compare призначений для вказування бінарного предиката, який буде отримувати на вході два елементи і повертати булеве значення. Параметр Alloc призначений для вказування об'єкта, який буде виділяти пам'ять для нових примірників даних. Контейнер map утримує свої дані в певному порядку відносно ключа (або індексу). На даний порядок впливає параметр Compare. Щоб додати дані до об'єкта даного класу необхідно скористатися шаблонним класом pair. Для доступу до даних контейнеру за їхніми ключами, можна скористатись оператором [] (як до масиву) і вказати необхідний ключ, або скористатись ітераторами чи методом find. Для того, щоб використовувати даний клас, необхідно підключити файл map:
#include <map> /* асоціативний контейнер map */

Нутрощі класу

Методи

/* конструктор за умовчанням */
explicit map (const key_compare& comp = key_compare(),
              const allocator_type& alloc = allocator_type()) ;

/* копіює дані з проміжку [first, last) до нового об'єкту */
template <class InputIterator>
  map (InputIterator first, InputIterator last,
       const key_compare& comp = key_compare(),
       const allocator_type& alloc = allocator_type()) ;

/* конструктор копіювання */
map (const map& x) ;
Конструктори класу std::map. Параметр key_compare призначений для вказування бінарного предикату, який буде порівнювати ключі і відповідно впливати на їх порядок (виражається через прямий перебір ітераторами класу). Параметр alloc вказує на політику створення і ініціювання нових об'єктів. Параметри first i last призначені для вказування проміжку, з якого новий об'єкт буде копіювати дані. Конструктор копіювання створює новий примірник класу map відносно параметра x.
      iterator begin () ;
const_iterator begin () const ;
Повертає ітератор на перший елемент послідовності, яку утримує контейнер. Якщо контейнер не містить даних, даний ітератор не повинен бути розйменованим (оператор *).
void clear () ;
Очищує внутрішні структури контейнеру і знищує усі елементи, в результаті чого контейнер більше не містить елементів.
size_type count (const key_type& k) const ;
Виконує обчислення кількості елементів у контейнері, які мають значення ключа k. Через те, що усі елементи у послідовності являються унікальними, даний метод завжди повертає 1, або нуль, якщо елементів з ключом k не існує в послідовності контейнера.
bool empty () const ;
Даний метод перевіряє, чи контейнер являється пустим (значення true), і повертає значення false, якщо у контейнері містяться дані.
      iterator end () ;
const_iterator end () const ;
Повертає ітератор на не існуючий елемент, який знаходиться за останнім існуючим елементом послідовності. Даний ітератор не повинен бути розйменованим (оператор *).
pair<const_iterator,const_iterator> equal_range (const key_type& k) const ;
pair<iterator,iterator>             equal_range (const key_type& k) ;
Повертає послідовність, обмежену парою ітераторів, яка вказує на елементи з однаковими ключами. Через те, що даний контейнер містить тільки унікальні ключі (в термінах одного об'єкту), даний метод повертає послідовність тільки з одного елементу, якщо він має ключ k, або пусту послідовність.
/* видаляє один елемент за ітератором  */
     void erase (iterator position) ;
     
/* видаляє один елемент за його ключом */
size_type erase (const key_type& k) ;

/* видаляє декілька елементів [first, last) */
     void erase (iterator first, iterator last) ;
Видаляє з контейнеру елементи послідовності. Параметри first i last призначені для вказування проміжку елементів [first, last), які необхідно видалити.
      iterator find (const key_type& k) ;
const_iterator find (const key_type& k) const ;
Виконує пошук елемента за його ключом. Повертає ітератор, який вказує на елемент з відповідним ключом, або значення ітератору, який повертає метод end().
allocator_type get_allocator () const ;
Повертає об'єкт, який використовується для створення нових елементів.
pair<iterator,bool> 
         insert (const value_type& val) ;

iterator insert (iterator position, const value_type& val) ;

template <class InputIterator>
    void insert (InputIterator first, InputIterator last) ;
Виконує вставку в послідовність контейнера нових елементів. Через те, що послідовність контейнера являється унікальною відносно значень ключів, даний метод перед вставкою елементів перевіряє присутність ключів у своїй послідовності. Якщо елемент вже присутній у послідовності, метод не вставляє новий елемент, і повертає ітератор на власний елемент послідовності з відповідним значення ключа. Альтернативою даних методів являється оператор [].
key_compare key_comp () const ;
Повертає об'єкт, який відповідальний за порівняння ключів елементів послідовності і відповідно впливає на її порядок.
      iterator lower_bound (const key_type& k) ;
const_iterator lower_bound (const key_type& k) const ;
Повертає ітератор, який вказує на елемент, що повинен стояти перед елементом з значенням k, або end() у іншому випадку.
size_type max_size () const ;
Повертає максимальне число елементів, які контейнер може вмістити.
map& operator = (const map& x) ;
Присвоює новий вміст контейнера, замінюючи його поточне значення.
mapped_type& operator [] (const key_type& k) ;
Оператор доступу до елементів. Якщо ключ k вже міститься у послідовності контейнера, він повертає значення, яке асоційоване з даним ключом. Якщо даний ключ відсутній у послідовності, оператор створює новий елемент з даним ключом і повертає посилання на комірку, яка повинна вміщувати дані, асоційовані з ним.
      reverse_iterator rbegin () ;
const_reverse_iterator rbegin () const ;
Повертає ітератор оберненого перебору елементів, який вказує на останній елемент послідовності.
      reverse_iterator rend () ;
const_reverse_iterator rend () const ;
Повертає ітератор на не існуючий елемент, який знаходиться перед першим елементом послідовності контейнеру. Даний ітератор не повинен бути розйменованим.
size_type size () const ;
Повертає кількість елементів у контейнері.
void swap (map& x) ;
Виконує обмін внутрішніми вказівниками контейнерів, в результаті чого елементи першого контейнеру, з якого викликається даний метод, переходять до другого, а елементи другого до першого контейнеру. Усі вказівники, ітератори залишаються валідними.
      iterator upper_bound (const key_type& k) ;
const_iterator upper_bound (const key_type& k) const ;
Повертає ітератор на елемент, який повинен розміщуватись за елементом з ключом k, або end().
value_compare value_comp () const ;
Повертає об'єкт бінарного предикату, який призначений для порівняння двох елементів послідовності, щоб визначити чи перший повинен знаходитись за другим.

Приклад

Розглянемо простий приклад використання контейнеру map в якості об'єкта для утримування ім'я користувачів і паролю, який їм відповідає.
#include <map> /* контейнер map */
#include <iostream> /* об'єкт C++ */
using namespace std ; /* друкуємо усе без std */

/* головна функція програми */
int main (int argc, char** argv)
{
  /* створюємо піддослідний примірник контейнеру */
  map<string, string> usr_pwd ;
  
  /* вставляємо нові позиціх за допомогою оператора [] */
  usr_pwd[ string("user1") ] = string ("bigsecret") ;
  usr_pwd[ string("User2") ] = string ("BigSecret") ;
  usr_pwd[ string("some_user") ] = string ("some_secret") ;
  
  /* вставляємо нову позицію за допомогою методу insert */
  usr_pwd.insert (pair<string,string>(string("USER1"),string("BIGSECRET"))) ;
  
  /* видаляємо елемент, з ключом some_user */
  usr_pwd.erase ( string("some_user") ) ;
  /* намагаємось видаляти неіснуючий елемент */
  usr_pwd.erase ( string("exists?") ) ;
  
  /* використовуючи ітератори класу map виводимо 
  ** вміст елементів контейнеру у термінал */
  for (map<string,string>::iterator iter=usr_pwd.begin(); /* створюємо ітератор */
       iter!=usr_pwd.end(); /* охорона циклу */
       ++iter) /* хід ітерації */
  {
    /* повідомлення */
    cout << "User: \"" << (*iter).first 
         << "\"; Password: \"" << (*iter).second << "\"."
         << endl ;  
  }
  
  /* виводимо розмір */
  cout << "Size of map: " << usr_pwd.size() << endl ;
  
  /* очищаємо контейнер */
  usr_pwd.clear () ;
  
  /* знову виводимо розмір */
  cout << "after clear: " << usr_pwd.size() << endl ;
  
  return 0 ;
}
Вивід програми: cpp_std_map_sample1-cxx
Категорії: