Menu
CoddyTech

范围 for 循环

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

带索引的传统 for 循环很适合遍历向量,而 C++ 提供了一种更优雅的方案:基于范围的 for 循环。这种现代语法无需手动管理索引,让代码更简洁、更易读。

基于范围的 for 循环会自动为你处理迭代细节。你无需管理索引变量,只需指定要对每个元素执行的操作:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

这个循环与传统的基于索引的方法做的事情完全相同,但语法简单得多。name 变量会自动依次获取向量中每个元素的值。

你可能会注意到循环声明中的 & 符号:const std::string& name。在这种情况下,& 并不表示“取地址”,这和你之前可能见过的用法不同。这里,它将 name 声明为对 vector 中每个元素的引用(别名),而不是创建元素的副本。你可以把它理解为给同一份数据起一个新名字,类似于使用指针指向该元素,但在循环体中不需要对它解引用。

const 关键字是一种安全措施:它可以防止你在循环体中通过别名意外修改元素。别名本身仍会在每次迭代时指向下一个新元素。保持不变的是你通过别名访问的内容,而不是循环的推进过程。

基于范围的 for 循环不仅更易读,也更安全,因为你不需要手动管理索引,所以不会有索引错误的风险。它适用于任何支持迭代的容器,是处理 C++ 数据集合的多用途工具。

challenge icon

挑战

简单

编写一个程序,通过处理一组城市名称并显示每个名称及其字符数,来演示基于范围的 for 循环。

程序将接收以下输入:

  • 一个整数 n,表示城市数量
  • 然后是 n 个表示城市名称的字符串

你的程序应该:

  1. 创建一个名为 cities 的 std::vector<std::string>
  2. 使用 push_back() 将 n 个城市名称逐个添加到向量中
  3. 使用基于范围的 for 循环遍历向量
  4. 对于循环中的每个城市,输出城市名称,然后使用 .length() 方法输出其长度
  5. 循环结束后,使用向量的 .size() 方法输出已处理的城市总数

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

City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]

基于范围的 for 循环应使用语法 for (const std::string& city : cities) 遍历向量中的每个元素。使用 city.length() 获取每个城市名称的字符数。

亲手试试

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // 读取城市数量
    int n;
    cin >> n;
    
    // 创建一个 vector 来存储城市名称
    vector<string> cities;
    
    // 读取城市名称并将它们添加到 vector 中
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: 在下方编写你的代码
    // 使用基于范围的 for 循环遍历 cities vector
    // 按指定格式输出每个城市及其名称长度
    // 循环结束后,输出已处理的城市总数
    
    return 0;
}
quiz icon自我测试

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

逻辑与流程中的所有课

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