Итерация по словарю
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 28 из 56.
Теперь, когда вы знаете, как создавать, изменять и удалять элементы из map, давайте узнаем, как перебрать все пары «ключ-значение» в вашем объекте map. Цикл for на основе диапазона (range-based for loop) предоставляет элегантный способ итерации по каждому элементу в std::map.
Вот базовый синтаксис для итерации по map:
for (auto pair : myMap) {
// Доступ к ключу через pair.first
// Доступ к значению через pair.second
}Каждый элемент в цикле представляет собой объект pair, который содержит два важных члена: first хранит ключ, а second хранит значение. Вот практический пример:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Это выведет имя каждого студента, а затем его оценку. Ключевое слово auto автоматически определяет правильный тип для каждой пары, делая ваш код чище и легче для чтения.
Задание
ЛегкоСоздайте программу, которая управляет системой меню ресторана, используя std::map. Ваша программа будет хранить пункты меню и их цены, а затем отображать полное меню, перебирая все пары ключ-значение.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество пунктов меню - Затем
nпар входных данных:- Строка, представляющая название блюда
- Число типа double, представляющее цену блюда
Ваша программа должна:
- Создать
std::map<std::string, double>с именемmenu - Считать количество пунктов меню
- Для каждого пункта меню считать название блюда и цену, а затем добавить их в карту, используя нотацию с квадратными скобками
- Использовать цикл for на основе диапазона (range-based for loop) для итерации по всей карте и вывода каждого блюда с его ценой
- Вычислить и вывести общее количество пунктов в меню
Используйте следующий точный формат вывода:
Restaurant Menu:
[dish1]: $[price1]
[dish2]: $[price2]
[dish3]: $[price3]
...
Total menu items: [number of items]Пункты меню должны быть выведены в том порядке, в котором они появляются при итерации по карте (в алфавитном порядке по названию блюда). Используйте цикл for на основе диапазона с auto pair : menu для итерации по карте, обращаясь к каждой паре ключ-значение через pair.first для названия блюда и pair.second для цены. Выводите каждую цену ровно с 2 знаками после запятой, используя std::fixed и std::setprecision(2).
Шпаргалка
Используйте цикл for на основе диапазона (range-based for loop) для итерации по всем парам ключ-значение в std::map:
for (auto pair : myMap) {
// Доступ к ключу через pair.first
// Доступ к значению через pair.second
}Каждый элемент представляет собой объект pair, где first содержит ключ, а second — значение:
std::map<std::string, int> scores;
scores["Alice"] = 95;
scores["Bob"] = 87;
scores["Carol"] = 92;
for (auto pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Ключевое слово auto автоматически определяет правильный тип для каждой пары.
Попробуйте сами
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
using namespace std;
int main() {
// Считать количество позиций в меню
int n;
cin >> n;
// Создать карту (map) для меню
map<string, double> menu;
// Считать названия блюд и цены
for (int i = 0; i < n; i++) {
string dish;
double price;
cin >> dish >> price;
// TODO: Добавить блюдо и цену в карту меню
}
// TODO: Вывести заголовок "Restaurant Menu:"
// TODO: Использовать цикл for на основе диапазона для итерации по меню и вывода каждого элемента
// Формат: [dish]: $[price] с 2 знаками после запятой
// TODO: Вывести общее количество позиций в меню
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями4Словари (пары ключ-значение)
Знакомство с std::mapСоздание словаряДоступ и изменение значенийПроверка наличия ключейУдаление парИтерация по словарюПовторение: частота слов2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров