C++. Класс map. Методы, обеспечивающие получение информации из контейнера

Методы, обеспечивающие получение информации из контейнера


Содержание


Поиск на других ресурсах:

1. Метод at(). Получить значение по ключу

Метод at() позволяет получить значение на основе заданного ключа. Общая форма объявления метода следующая

inline const valueType& at(const keyType& key) const;
inline valueType& at(const keyType& key);

здесь

  • keyType – тип ключа;
  • valueType – тип значения;
  • key – значение ключа.

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод clear() - очистить массив
  // 1. Сформировать ассоциативный массив
  map<string, int> Days;
  Days.insert(make_pair("January", 31));
  Days.insert(make_pair("February", 28));
  Days.insert(make_pair("March", 31));
  Days.insert(make_pair("April", 30));

  // 2. Вывести количество дней в январе - метод at()
  cout << Days.at("January") << endl; // 31

  // 3. Вывести количество дней в апреле
  int daysApril = Days.at("April");
  cout << daysApril << endl; // 30

  // 4. Задать несуществующий ключ - нужно его обработать блоком try-catch
  try
  {
    // ключа "ABCD" нет в контейнере
    int t = Days.at("ABCD");
  }
  catch (std::out_of_range e)
  {
    cout << e.what() << endl;
  }
}

Результат

31
30
invalid map<K, T> key

 

2. Методы begin(), end(). Установить итератор на начало, конец массива

Методы begin() и end() позволяют получить итератор на начало и конец ассоциативного массива. Конец ассоциативного массива определяется как элемент, следующий за последним элементом массива.
Общая форма объявления методов следующая:

iterator begin();
const iterator begin() const;
iterator end();
const iterator end() const;

На рисунке 1 показан пример, в котором показаны позиции, возвращаемые методами begin() и end().

C++. Класс map. Методы begin(), end(). Начало и конец ассоциативного контейнера

Рисунок 1. Возврат результата методами begin() и end()

Пример.

В примере формируется ассоциативный контейнер, изображенный на рисунке 1. Затем с помощью методов begin() и end() определяются границы контейнера и происходит вывод контейнера на экран с помощью итератора.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Методы begin() и end()
  // 1. Создать ассоциативный контейнер
  map<int, string> m1;
  m1.insert(pair<int, string>(1, "Winter"));
  m1.insert(pair<int, string>(2, "Spring"));
  m1.insert(pair<int, string>(3, "Summer"));
  m1.insert(pair<int, string>(4, "Autumn"));

  // 2. Получить итератор на начало и конец контейнера
  map<int, string>::iterator it, itEnd;
  it = m1.begin();
  itEnd = m1.end();

  // 3. Вывести содержимое контейнера на экран
  cout << "m1:" << endl;
  while (it!=itEnd)
  {
    cout << it->first << " : " << it->second << endl;
    it++;
  }
}

Результат

m1:
1 : Winter
2 : Spring
3 : Summer
4 : Autumn

 

3. Метод count(). Получить количество дубликатов по ключу

Метод count() возвращает количество дубликатов элемента со значением ключа. Данный метод актуален для класса multimap, в котором одному ключу может соответствовать несколько значений. Общая форма объявления метода следующая:

inline size_t count(const keyType &keyVal) const;

здесь

  • keyType – тип ключа;
  • keyVal – значение ключа.

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод count() - получить количество дубликатов по заданному ключу
  // 1. Сформировать ассоциативный массив
  map<char, string> Colors;
  Colors.insert(make_pair('R', "Red"));
  Colors.insert(make_pair('G', "Green"));
  Colors.insert(make_pair('B', "Blue"));

  // 2. Попытка создать еще один дубликат ключа 'B'
  Colors.insert(make_pair('B', "Black")); // работает

  // 3. Вывести количество дубликатов для ключа 'B'
  cout << Colors.count('B') << endl; // 1

  // 4. Вывести количество дубликатов для ключа 'R'
  cout << Colors.count('R') << endl; // 1

  // 5. Попытка доступиться к несуществующему ключу
  try
  {
    cout << Colors.count('F') << endl; // 0
  }
  catch (out_of_range e)
  {
    cout << e.what() << endl;
  }
}

Результат

1
1
0

 

4. Метод empty(). Определить, пуст ли массив

Метод empty() позволяет определить, есть ли в ассоциативном контейнере элементы. Спецификация метода имеет вид

inline bool empty() const;

Метод возвращает true, если в контейнере имеется хотя бы один элемент. Иначе метод возвращает false.

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод empty() - определить, пуст ли массив
  // 1. Создать пустой контейнер
  map<int, char> m1;

  // 2. Вызвать функцию empty()
  if (m1.empty())
    cout << "m1 is empty" << endl;
  else
    cout << "m1 is not empty" << endl;

  // 3. Прибавить к контейнеру несколько элементов
  m1.insert(make_pair(1, 'A'));
  m1.insert(make_pair(2, 'B'));
  m1.insert(make_pair(3, 'C'));

  // 4. Повторно вызвать empty()
  if (m1.empty())
    cout << "m1 is empty" << endl;
  else
    cout << "m1 is not empty" << endl;
}

Результат

m1 is empty
m1 is not empty

 

5. Метод find(). Получить итератор на заданный ключ

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

inline iterator find(const keyType &keyVal) const;
inline iterator find(const keyType &keyVal);

здесь

  • keyType – тип ключа;
  • keyVal – значение ключа.

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод find() - найти элемент по ключу
  // 1. Сформировать ассоциативный массив
  map<bool, string> m1;
  m1.insert(make_pair(true, "True"));
  m1.insert(make_pair(false, "False"));

  // 2. Найти ключ true и вывести его
  map<bool, string>::iterator it;
  it = m1.find(true);
  cout << it->first << " : " << it->second << endl;

  // 3. Найти ключ false и вывести его
  it = m1.find(false);
  cout << it->first << " : " << it->second << endl;
}

Результат

1 : True
0 : False

 

6. Метод max_size(). Максимальный размер контейнера

Метод max_size() возвращает максимальное количество элементов в контейнере. Это количество зависит от типа ключа и значения в паре, размера свободной памяти и т.д.

Синтаксис объявления метода

inline size_t max_size() const;

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод max_size() - получить максимально возможный размер контейнера
  // 1. Объявить пустой контейнер
  map<string, string> code;

  // 2. Прибавить к контейнеру элемент
  code.insert(make_pair("USA", "1"));

  // 3. Вывести max_size()
  cout << code.max_size() << endl; // 164703072086692425

  // 4. Прибавить еще элемент
  code.insert(make_pair("Ukraine", "380"));

  // 5. Вывести max_size()
  cout << code.max_size() << endl; // 164703072086692425
}

Результат

164703072086692425
164703072086692425

 

7. Метод size(). Получить текущее количество элементов в массиве

Метод size() возвращает количество элементов в ассоциативном контейнере. При создании пустого контейнера метод вернет 0.

Синтаксис объявления метода

inline size_t size() const;

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Метод size() - получить размер контейнера
  // 1. Объявить пустой контейнер
  map<string, string> code;

  // 2. Получить размер контейнера
  int size = code.size();
  cout << size << endl; // 0

  // 3. Прибавить к контейнеру элемент
  code.insert(make_pair("USA", "1"));

  // 4. Вывести size()
  cout << code.size() << endl; // 1

  // 5. Прибавить еще элемент
  code.insert(make_pair("Ukraine", "380"));

  // 6. Вывести size()
  cout << code.size() << endl; // 2
}

Результат

0
1
2

 

8. Операторная функция operator[](). Получить значение по заданному ключу

С помощью операторной функции operator[]() можно обращаться к значениям массива по его ключам естественным способом с помощью квадратных скобок []. Синтаксис объявления функции в классе map следующий

inline vType& map<kType, vType>::operator[](kType &&_KeyVal);

здесь

  • kType – тип ключа;
  • vType – тип значения;
  • _KeyVal – значение ключа.

Метод может использоваться как в выражении, так и в левой части оператора присваивания =.
Если ключ _KeyVal отсутствует в контейнере, и операция [] используется в левой части оператора присваивания, создается ключ с соответствующим значением.

Пример.

#include <iostream>
#include <map>
using namespace std;

void main()
{
  // Операторная функция operator[] - переопределение оператора []
  // 1. Создать контейнер через список инициализации
  initializer_list<pair<const string, int>> lst = {
    make_pair("Jan", 31),
    make_pair("Feb", 28),
    make_pair("Mar", 31),
    make_pair("Apr", 30),
    make_pair("May", 31),
    make_pair("Jun", 30),
    make_pair("Jul", 31),
    make_pair("Aug", 31),
    make_pair("Sep", 30),
    make_pair("Oct", 31),
    make_pair("Nov", 30),
    make_pair("Dec", 31)
  };
  map<string, int> m1;
  m1.insert(lst);

  // 2. Получить количество дней в марте
  int d = m1["Mar"];
  cout << "d = " << d << endl;

  // 3. Изменить количество дней в феврале
  m1["Feb"] = 29;

  // 4. Проверка, изменено ли количество дней в феврале
  d = m1["Feb"]; // d = 29
  cout << "d = " << d << endl;

  // 5. Создать новую пару "ABCD":333
  m1["ABCD"] = 333;

  // 6. Вывести массив
  map<string, int>::iterator it = m1.begin();
  cout << "m1:" << endl;
  while (it != m1.end())
  {
    cout << it->first << ":" << it->second << endl;
    it++;
  }
}

Результат

d = 31
d = 29
m1:
ABCD:333
Apr:30
Aug:31
Dec:31
Feb:29
Jan:31
Jul:31
Jun:30
Mar:31
May:31
Nov:30
Oct:31
Sep:30

 


Связанные темы