C++中的for-each循环

文章目录

      • 基本语法
      • 举例说明
        • [1. 遍历数组](#1. 遍历数组)
        • [2. 遍历`std::vector`](#2. 遍历std::vector)
        • [3. 遍历容器中的对象](#3. 遍历容器中的对象)
        • [4. 使用引用修改元素](#4. 使用引用修改元素)
        • [5. 使用`const`保护元素](#5. 使用const保护元素)
      • 范围循环的使用注意事项
      • 总结

C++中的范围循环(Range-based for loop),也称为for-each循环,是C++11引入的一种简化数组或容器遍历的循环方式。相比传统的for循环,for-each更加简洁且不容易出错,特别是在遍历STL容器时。

基本语法

范围循环的语法结构如下:

cpp 复制代码
for (declaration : range_expression) {
    // loop body
}
  • declaration :用于定义循环中的迭代变量(类似于传统for循环中的计数器)。
  • range_expression:需要遍历的容器、数组或范围。

举例说明

我们通过几个例子来讲解范围循环的使用。

1. 遍历数组
cpp 复制代码
#include <iostream>

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

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

    return 0;
}

输出:

1 2 3 4 5

在这个例子中,int num 是声明的循环变量,它会依次获取arr数组中的每一个元素。

2. 遍历std::vector
cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};

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

    return 0;
}

输出:

10 20 30 40 50

与遍历数组类似,这里通过范围循环可以简洁地遍历std::vector中的元素。

3. 遍历容器中的对象

范围循环不仅可以遍历简单的基本类型数组或容器,也可以用来遍历容器中的对象:

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

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}, {"Charlie", 35}};

    // 使用范围循环遍历对象
    for (const Person& person : people) {
        std::cout << person.name << ": " << person.age << "\n";
    }

    return 0;
}

输出:

Alice: 25
Bob: 30
Charlie: 35
4. 使用引用修改元素

范围循环可以通过引用访问元素,从而对容器中的元素进行修改。如果不使用引用,循环中得到的只是元素的副本,无法对原数组或容器中的元素进行修改。

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

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

    // 使用引用来修改元素
    for (int& num : vec) {
        num *= 2;  // 将每个元素翻倍
    }

    // 输出修改后的容器
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

输出:

2 4 6 8 10

通过int& num,我们可以访问并修改vec容器中的每个元素。

5. 使用const保护元素

有时候我们不希望在循环中修改元素,可以使用const来确保元素不会被修改:

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

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};

    // 使用 const 来防止修改元素
    for (const int& num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

这里的const int&确保了num只是一个只读的引用,无法在循环内部对其进行修改。

范围循环的使用注意事项

  1. 迭代副本与引用

    • 如果在范围循环中不使用引用(如for (int num : vec)),则会遍历每个元素的副本,无法对原数组或容器进行修改。
    • 如果使用引用(如for (int& num : vec)),则可以直接修改原数组或容器的元素。
  2. 常量性保护

    • 通过使用const关键字,可以确保元素在循环中不会被修改,确保数据的安全性。
  3. 适用范围

    • 范围循环适用于所有可以使用begin()end()方法的容器,例如数组、std::vectorstd::liststd::set等STL容器。
  4. 不可用于某些C++98容器

    • C++98/03标准中的某些自定义容器没有提供begin()end()方法,因此无法直接使用范围循环。

总结

范围循环是C++中遍历容器、数组的一种简洁、直观的方式,能减少代码的复杂度,提高代码的可读性。通过对引用与常量的合理使用,可以更灵活地控制数据访问与修改。

相关推荐
黑客-雨7 分钟前
从零开始:如何用Python训练一个AI模型(超详细教程)非常详细收藏我这一篇就够了!
开发语言·人工智能·python·大模型·ai产品经理·大模型学习·大模型入门
Pandaconda12 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
半盏茶香13 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
加油,旭杏16 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知16 分钟前
3.3 Go 返回值详解
开发语言·golang
xcLeigh20 分钟前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
哎呦,帅小伙哦21 分钟前
Effective C++ 规则41:了解隐式接口和编译期多态
c++·effective c++
NoneCoder30 分钟前
JavaScript系列(38)-- WebRTC技术详解
开发语言·javascript·webrtc
关关钧41 分钟前
【R语言】数学运算
开发语言·r语言
十二同学啊43 分钟前
JSqlParser:Java SQL 解析利器
java·开发语言·sql