Методы, обеспечивающие получение информации из контейнера
Содержание
- 1. Метод at(). Получить значение по ключу
- 2. Методы begin(), end(). Установить итератор на начало, конец массива
- 3. Метод count(). Получить количество дубликатов по ключу
- 4. Метод empty(). Определить, пуст ли массив
- 5. Метод find(). Получить итератор на заданный ключ
- 6. Метод max_size(). Максимальный размер контейнера
- 7. Метод size(). Получить текущее количество элементов в массиве
- 8. Операторная функция operator[](). Получить значение по заданному ключу
- Связанные темы
Поиск на других ресурсах:
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().
Рисунок 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
⇑
Связанные темы
- Создание контейнера. Конструкторы. Создание пары. Обзор функций и операторов класса
- Методы, изменяющие данные в контейнере: clear(), erase(), insert(), swap(), operator=()
⇑