Menu
CoddyTech

遍历映射

本课属于 Coddy C++ 学习旅程的“逻辑与流程”单元。第 28 课,共 56 课。

现在你已经知道如何在映射中创建、修改和删除元素,接下来学习如何遍历映射中的所有键值对。基于范围的 for 循环可以优雅地遍历 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 关键字会自动确定每对数据的正确类型,让你的代码更简洁、更易读。

challenge icon

挑战

简单

使用 std::map 创建一个管理餐厅菜单的程序。你的程序会存储菜品及其价格,然后遍历所有键值对,显示完整菜单。

将提供以下输入:

  • 一个整数 n,表示菜单项的数量
  • 接着是 n 组输入:
    • 一个表示菜品名称的字符串
    • 一个表示菜品价格的 double

你的程序应当:

  1. 创建一个名为 menu 的 std::map<std::string, double>
  2. 读取菜单项的数量
  3. 对于每个菜单项,读取菜品名称和价格,然后使用方括号表示法将它们添加到映射中
  4. 使用基于范围的 for 循环遍历整个映射,并打印每道菜及其价格
  5. 计算并打印菜单中的项目总数

使用以下精确的输出格式:

Restaurant Menu:
[dish1]: $[price1]
[dish2]: $[price2]
[dish3]: $[price3]
...
Total menu items: [number of items]

菜单项应按照遍历映射时的顺序打印(按菜品名称的字母顺序)。使用基于范围的 for 循环 auto pair : menu 遍历映射,使用 pair.first 访问每个键值对中的菜品名称,使用 pair.second 访问价格。使用 std::fixed 和 std::setprecision(2) 打印每个价格,且小数点后恰好保留 2 位。

亲手试试

#include <iostream>
#include <map>
#include <string>
#include <iomanip>
using namespace std;

int main() {
    // 读取菜单项的数量
    int n;
    cin >> n;
    
    // 创建菜单映射
    map<string, double> menu;
    
    // 读取菜品和价格
    for (int i = 0; i < n; i++) {
        string dish;
        double price;
        cin >> dish >> price;
        // TODO: 将菜品和价格添加到菜单映射中
    }
    
    // TODO: 打印 "Restaurant Menu:" 标题
    
    // TODO: 使用基于范围的 for 循环遍历 menu,并打印每一项
    // 格式:[dish]: $[price],价格保留 2 位小数
    
    // TODO: 打印菜单项总数
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C++ 在线编译器