Давайте создадим простую программу на C++, которая реализует телефонный справочник с использованием стандартных контейнеров. Мы будем использовать std::map для хранения соответствий между номерами телефонов и фамилиями, а также между фамилиями и номерами телефонов.
Вот пример реализации программы:
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <sstream>
using namespace std;
int main() {
map<string, string> phoneBook; // для хранения соответствия номер - фамилия
map<string, vector<string>> surnameToPhones; // для хранения соответствия фамилия - номера
string command;
while (getline(cin, command)) {
istringstream iss(command);
string firstPart;
if (isdigit(command[0])) { // Если команда начинается с цифры, это уже номер телефона
string number;
iss >> number;
if (iss.eof()) { // Запрос по номеру
if (phoneBook.find(number) != phoneBook.end()) {
cout << phoneBook[number] << endl;
} else {
cout << "Абонент не найден" << endl;
}
} else { // Этот случай — добавление номера и фамилии
string surname;
iss >> surname;
// Добавляем запись в телефонный справочник
phoneBook[number] = surname;
surnameToPhones[surname].push_back(number);
}
} else { // Если команда не начинается с цифры, это фамилия
string surname = command;
// Запрос по фамилии
if (surnameToPhones.find(surname) != surnameToPhones.end()) {
for (const string& number : surnameToPhones[surname]) {
cout << number << " ";
}
cout << endl;
} else {
cout << "Абонент не найден" << endl;
}
}
}
return 0;
}
Как работает программа:
Структуры данных:
- Используется
mapдля хранения пары "номер телефона - фамилия". - Вторая
mapхранит фамилии, каждая из которых указывает на вектор номеров телефонов. Это позволяет хранить несколько номеров для одной фамилии.
- Используется
Основной цикл программы:
- Программа считывает строки с командами.
- Если строка начинается с цифры, это номер телефона. В зависимости от наличия еще данных в строке, программа либо возвращает фамилию по номеру, либо добавляет новую запись.
- Если строка содержит фамилию, программа ищет все номера телефонов, связанные с этой фамилией.
Вывод:
- При выполнении запросов на поиск фамилий и номеров, программа выводит результаты в консоль.
Замечания:
- Эта программа обрабатывает команды в режиме
O(log n)для вставки и поиска благодаря использованиюmap. - Если фамилия имеет несколько номеров, они выводятся через пробел.
Запустите программу и протестируйте ее с различными входными данными, чтобы убедиться в корректности работы!
