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

Клас 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

 


Споріднені теми