Создание словаря
Часть раздела Логика и управление потоком путешествия по C++ на Coddy — урок 24 из 56.
Теперь, когда вы понимаете, что такое map, давайте узнаем, как его создать и добавить в него пары «ключ-значение». При объявлении std::map необходимо указать как тип ключа, так и тип значения, используя угловые скобки.
Вот базовый синтаксис для создания map:
std::map<KeyType, ValueType> mapName;Например, чтобы создать карту (map), которая хранит имена студентов в качестве ключей и их результаты тестов в качестве значений:
std::map<std::string, int> studentScores;Чтобы добавить элементы в ваш map, вы можете использовать синтаксис квадратных скобок с ключом, а затем присвоить значение:
studentScores["Alice"] = 95;
studentScores["Bob"] = 87;
studentScores["Carol"] = 92;Это создает три пары «ключ-значение» в коллекции map. Имя каждого студента служит ключом, позволяющим быстро извлечь соответствующий ему балл.
Чтобы перебрать все записи в ассоциативном массиве (map), используйте цикл for на основе диапазона (range-based for loop) с auto. Каждый элемент в std::map представляет собой пару «ключ-значение», поэтому вы обращаетесь к ключу через .first, а к значению — через .second:
for (const auto& pair : studentScores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}Здесь auto автоматически определяет тип каждого элемента, pair.first возвращает ключ (имя студента), а pair.second возвращает значение (балл). Обратите внимание, что std::map всегда выполняет итерацию в отсортированном по ключу порядке.
Задание
ЛегкоСоздайте программу, которая строит систему отслеживания оценок студентов с использованием std::map. Ваша программа будет хранить имена студентов в качестве ключей и их баллы за тесты в качестве значений.
Будут предоставлены следующие входные данные:
- Целое число
n, представляющее количество студентов - Затем
nпар входных данных:- Строка, представляющая имя студента
- Целое число, представляющее балл студента
Ваша программа должна:
- Создать
std::map<std::string, int>с именемgrades - Прочитать количество студентов
- Для каждого студента прочитать его имя и балл, затем добавить их в ассоциативный массив (map), используя нотацию квадратных скобок
- После добавления всех студентов вывести информацию о каждом студенте в формате, указанном ниже
- Вычислить и вывести общее количество студентов, хранящихся в ассоциативном массиве
Используйте следующий точный формат вывода:
Student Grades:\n[student1]: [score1]\n[student2]: [score2]\n[student3]: [score3]\n...\nTotal students: [number of students]Студенты должны выводиться в том порядке, в котором они появляются при итерации по ассоциативному массиву (который будет алфавитным, так как карты автоматически сортируются по ключу). Используйте цикл for на основе диапазона (range-based for loop) для итерации по ассоциативному массиву, обращаясь к каждой паре ключ-значение и выводя имя студента, а затем его балл.
Шпаргалка
Чтобы создать std::map, укажите типы ключа и значения в угловых скобках:
std::map<KeyType, ValueType> mapName;Пример со строковыми ключами и целочисленными значениями:
std::map<std::string, int> studentScores;Добавьте элементы, используя синтаксис квадратных скобок:
studentScores["Alice"] = 95;
studentScores["Bob"] = 87;
studentScores["Carol"] = 92;Перебирайте элементы словаря (map) с помощью цикла for на основе диапазона. Каждый элемент представляет собой пару — используйте .first для доступа к ключу и .second для доступа к значению:
for (const auto& pair : studentScores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}auto автоматически выводит тип каждого элемента, а const auto& позволяет избежать ненужного копирования.
Попробуйте сами
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
// Считать количество студентов
int n;
cin >> n;
// Создать map для хранения оценок
map<string, int> grades;
// TODO: Напишите ваш код здесь
// Считать имя и оценку каждого студента, затем добавить в map
// Вывести результаты
cout << "Student Grades:" << endl;
// TODO: Используйте цикл for на основе диапазона (range-based), чтобы вывести оценку каждого студента
// Вывести общее количество студентов
cout << "Total students: " << grades.size() << endl;
return 0;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Указатели и память
Что такое указатель?Оператор взятия адресаОператор разыменованияНулевые указателиУказатели и массивыДинамическая память и 'new'Освобождение памяти и 'delete'Итоги: Практика с указателями4Словари (пары ключ-значение)
Знакомство с std::mapСоздание словаряДоступ и изменение значенийПроверка наличия ключейУдаление парИтерация по словарюПовторение: частота слов2Векторы (динамические массивы)
Знакомство с std::vectorСоздание вектораДобавление элементовДоступ к элементамРазмер вектораИтерация с помощью цикла ForRange-based цикл ForУдаление элементовИтоги: операции с векторами5Проект: Инструмент инвентаризации
Настройка проектаДобавление и обновление товаров