Что такое контейнер map в С++ и когда необходимо его использовать и массивы
При использовании массива строк в C++, каждой строке ставится в соответствие цифра(индекс массива).
Но, что делать в случае когда требуется установить соответствие между именами и номерами телефонов(задача о хранении телефонного справочника). В этом случае с массивами увы такого не провернешь. И поэтому стоит обратить внимание на контейнер map в c++.
Map в c++, которую также называют ассоциативным массивом, позволяет устанавливать соответствие между двумя элементами любого типа, первый из которых называют ключом(key), а второй значением(value).
Стоит запомнить, что в c++ map все ключи являются уникальными! В случае же если в структуре данных могут находится дублирующие ключи стоит использовать multimap. О multimapпоговорим в другой статье.
Простой пример использования map в c++
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main ()
{
// следующая строка создает соответствие между
// двумя строками: именем владельца и маркой его машины
map<string,string> nameToCar;
nameToCar["Ivan"]="BMW";
nameToCar["Alex"]="Honda";
cout << "Ivan`s car is a " << nameToCar["Ivan"] << endl;
cout << "Alex`s car is a " << nameToCar["Alex"] << endl;
}
Стоит отметить, что как и другие контейнеры, map в c++ располагает следующими методами: size, begin и end.
Давайте рассмотрим еще один пример. Нижеприведенный код делает часточный подсчет каждого символа в строке и выводит частоту употребления каждого символа. При итерации по map в с++ крайне удобно использовать класс pair (пара) стандартной библиотеки С++, которая предоставляет два публичных поля first и second (first – ключ, second – значение, соответственно).
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
map<char,int> symByFrequency;
void countFreq(char sym) {
// Увеличиваем на один частотность встреченного sym в map'e
symByFrequency[sym]++;
}
void printPair(pair<char,int> the_pair){
cout << the_pair.first << " " << the_pair.second << endl;
}
string text="maps, constainers and associative array";
int main ()
{
// считаем частоту появления для каждого символа
// и выводим результат на экран
for_each(text.begin(), text.end(), countFreq);
for_each(symByFrequency.begin(), symByFrequency.end(), printPair);
}
Таким образом в нашем случае for_each передает оперирует парами вида pair<char,int> и предоставляет удобный доступ и к ключу и к значению.
Задание для тренировки навыков работы с map в С++
Напишите программу, которая просит юзера ввести имя, либо exit в том случае, если юзер хочет увидеть список всех введенных ранее имен и выйти из программы. Если введенной пользователем имя вводилось ранее, требуется вывести относящийся к данному имени номер телефона, иначе запросить у пользователя ввести номер.
Крохотная подсказка к заданию выше: стоит заиспользовать следующего вида мапу: map<string,string> addressBook, и обратить внимание на методы for_each и find. Успехов!