Menu
Coddy logo textTech

Создание словаря

Часть раздела Логика и управление потоком путешествия по 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 всегда выполняет итерацию в отсортированном по ключу порядке.

challenge icon

Задание

Легко

Создайте программу, которая строит систему отслеживания оценок студентов с использованием std::map. Ваша программа будет хранить имена студентов в качестве ключей и их баллы за тесты в качестве значений.

Будут предоставлены следующие входные данные:

  • Целое число n, представляющее количество студентов
  • Затем n пар входных данных:
    • Строка, представляющая имя студента
    • Целое число, представляющее балл студента

Ваша программа должна:

  1. Создать std::map<std::string, int> с именем grades
  2. Прочитать количество студентов
  3. Для каждого студента прочитать его имя и балл, затем добавить их в ассоциативный массив (map), используя нотацию квадратных скобок
  4. После добавления всех студентов вывести информацию о каждом студенте в формате, указанном ниже
  5. Вычислить и вывести общее количество студентов, хранящихся в ассоциативном массиве

Используйте следующий точный формат вывода:

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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком