C++范围基 for 循环

范围基 for 循环(Range-based for loop)是 C++11 引入的一种更简洁、更安全的遍历容器(如数组、向量、列表等)的方式。它简化了传统 for 循环和迭代器的使用,使代码更加清晰易读。下面详细介绍范围基 for 循环的语法、用法和一些注意事项。

语法

范围基 for 循环的基本语法如下:

cpp 复制代码
for ( : ) {
    // 循环体
}

其中,range 是要遍历的容器,element 是每次迭代中从容器中取出的元素的副本或引用。

示例

假设我们有一个 vector<int>,我们想遍历它并输出每个元素:

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用范围基 for 循环遍历 vector
    for (int element : vec) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5

1. 遍历数组

范围基 for 循环同样适用于数组:

cpp 复制代码
#include <iostream>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int n = sizeof(arr) / sizeof(arr[0]);

    // 使用范围基 for 循环遍历数组
    for (int element : arr) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5

2. 遍历字符串

范围基 for 循环也可以用于遍历字符串:

cpp 复制代码
#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";

    // 使用范围基 for 循环遍历字符串
    for (char ch : str) {
        std::cout << ch << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

H e l l o , W o r l d !

3. 修改容器中的元素

如果需要在遍历过程中修改容器中的元素,可以使用引用:

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用范围基 for 循环遍历并修改 vector
    for (int &element : vec) {
        element *= 2;  // 修改元素
    }

    // 输出修改后的 vector
    for (int element : vec) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

2 4 6 8 10

4. 遍历自定义容器

范围基 for 循环也可以用于自定义容器,只要该容器支持迭代器操作:

cpp 复制代码
#include <iostream>
#include <vector>

class MyContainer {
public:
    std::vector<int> data;

    // 构造函数
    MyContainer(const std::vector<int>& d) : data(d) {}

    // 返回迭代器
    auto begin() { return data.begin(); }
    auto end() { return data.end(); }
};

int main() {
    MyContainer container({1, 2, 3, 4, 5});

    // 使用范围基 for 循环遍历自定义容器
    for (int element : container) {
        std::cout << element << " ";
    }
    std::cout << std::endl;

    return 0;
}

输出:

1 2 3 4 5

注意事项

  1. 引用与副本

    • 使用 int element 时,element 是容器中每个元素的副本。

    • 使用 int &element 时,element 是容器中每个元素的引用,可以修改原元素。

    • 使用 const int &element 时,element 是容器中每个元素的常量引用,不能修改原元素,但可以提高效率。

  2. 性能考虑

    • 如果不需要修改容器中的元素,使用 const 引用可以提高性能,因为避免了不必要的复制。

    • 如果需要修改容器中的元素,使用非 const 引用。

  3. 范围基 for 循环的限制

    • 范围基 for 循环不适用于需要同时访问多个元素(如前一个和后一个元素)的场景。在这种情况下,传统的 for 循环或迭代器可能更合适。

总结

范围基 for 循环是一种简洁、安全的遍历容器的方式,适用于大多数需要遍历容器的场景。通过合理使用引用和常量引用,可以提高代码的效率和可读性。

相关推荐
学计算机的计算基14 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana218 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
AOwhisky20 分钟前
Python 学习笔记(第五期)——组合数据类型:列表、元组、集合与字典精讲——核心知识点自测与详解
开发语言·笔记·python·学习·云计算
万亿少女的梦16837 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦9 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-10 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-10 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程