C++11基于范围for循环之高效遍历新方式

 更新时间:2025年08月12日 09:04:17   作者:咸鱼_要_翻身  
在C++编程中,循环是一种常用的结构,用于重复执行某段代码,这篇文章主要介绍了C++11基于范围for循环之高效遍历新方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、传统遍历方式的局限性

在C++98中,遍历数组通常采用以下方式:

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 将数组元素值全部乘以2
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
    arr[i] *= 2;
}

// 打印数组中的所有元素
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
    cout << arr[i] << " ";
}
cout << endl;

这种传统方式存在几个问题:

  1. 需要手动计算数组长度

  2. 循环控制变量(i)需要显式声明和管理

  3. 容易产生越界错误

  4. 代码冗长,意图不够直观

二、基于范围的for循环语法

基于范围的for循环(range-based for loop)是C++11引入的一种简化循环语法,它提供了一种更简洁的方式来遍历容器或数组中的所有元素。

基本语法

for (declaration : range_expression) {
    // 循环体
}

其中:

  • declaration(声明部分):定义一个变量,每次迭代时它会被初始化为当前元素的值,通常使用auto自动推导类型

  • range_expression(范围部分):表示要遍历的序列(如数组、容器等)

  • for (声明 : 范围) 是基本语法结构

  • 可以使用continue结束本次循环,或break跳出整个循环​

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 将数组元素值全部乘以2
for (auto& e : arr) {
    e *= 2;
}

// 打印数组中的所有元素
for (auto e : arr) {
    cout << e << " ";
}
cout << endl;

三、使用示例

1、遍历数组

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

for (int num : arr) {
    cout << num << " ";
}
// 输出: 1 2 3 4 5

2、遍历标准容器

std::vector<std::string> words = {"Hello", "World", "C++"};

for (const auto& word : words) {
    cout << word << " ";
}
// 输出: Hello World C++

3、使用auto自动推导类型

std::list<double> values = {1.1, 2.2, 3.3};

for (auto value : values) {
    cout << value << " ";
}
// 输出: 1.1 2.2 3.3

4、修改容器元素

std::vector<int> nums = {1, 2, 3};

for (auto& num : nums) {
    num *= 2;  // 修改元素
}

// nums现在是 {2, 4, 6}

四、使用条件

1、迭代范围必须明确

  • 对于数组:编译器能确定首元素和末元素的位置

  • 对于类:需要提供begin()end()方法,定义迭代范围

2、迭代对象需要支持迭代器操作

  • 迭代器需要实现++(前进)和==(比较)操作

  • 实际上,任何提供了begin()和end()方法并返回迭代器的类型都可以使用范围for

五、底层实现原理

范围for循环的底层实现基于迭代器:

  • 对于数组:转换为传统的指针遍历

  • 对于容器:转换为使用该容器的迭代器进行遍历

  • 可以通过查看汇编代码验证这一实现方式

工作原理

基于范围的for循环在底层会被编译器转换为传统的迭代器循环。例如:

for (auto& item : container) {
    // ...
}

大致等价于:

{
    auto&& __range = container;
    auto __begin = begin(__range);
    auto __end = end(__range);
    for (; __begin != __end; ++__begin) {
        auto& item = *__begin;
        // ...
    }
}

六、注意事项

1、引用与拷贝:

  • 使用auto item会创建元素的拷贝

  • 使用auto& item会创建元素的引用(可修改原元素)

  • 使用const auto& item会创建常量引用(不可修改原元素)

2、临时范围表达式:

for (auto x : getTemporaryVector()) { /* ... */ }  // 临时对象会延长生命周期

3、不支持的情况:

  • 不能用于指针数组(除非知道数组大小)

  • 不能用于动态分配的数组

  • 不能用于不提供begin()/end()成员或自由函数的类型

4、性能考虑:

  • 对于简单类型,使用auto或auto&性能差异不大

  • 对于复杂类型,避免不必要的拷贝

5、重点:

  1. 当需要修改元素时,迭代变量应声明为引用类型(使用&)

  2. 对于不需要修改的只读访问,使用非引用形式更高效

  3. 范围for循环不支持直接获取当前元素的索引位置

  4. 在循环过程中不应修改容器的大小(如添加/删除元素)

基于范围的for循环大大简化了集合遍历的代码,提高了可读性和安全性,是现代C++编程中推荐使用的遍历方式。

七、自定义类型支持

要让自定义类型支持基于范围的for循环,需要提供begin()和end()成员函数或自由函数:

class MyContainer {
    int data[5] = {1, 2, 3, 4, 5};
public:
    int* begin() { return data; }
    int* end() { return data + 5; }
    // 也可以提供const版本
};

MyContainer c;
for (int x : c) {
    cout << x << " ";
}

总结 

到此这篇关于C++11基于范围for循环之高效遍历新方式的文章就介绍到这了,更多相关C++11范围for循环遍历方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++ Boost Conversion超详细讲解

    C++ Boost Conversion超详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++结构体详解

    C++结构体详解

    这篇文章主要介绍了C++ 结构体与共用体的的相关资料,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下,希望能够给你带来帮助
    2021-09-09
  • C语言魔塔游戏的实现代码

    C语言魔塔游戏的实现代码

    这篇文章主要介绍了C语言魔塔游戏的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 基于C++全局变量的声明与定义的详解

    基于C++全局变量的声明与定义的详解

    本篇文章是对C++全局变量的声明与定义进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言函数超详细讲解上篇

    C语言函数超详细讲解上篇

    函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数,函数我们分两篇来讲解,接下来开始第一篇
    2022-04-04
  • c++如何实现归并两个有序链表

    c++如何实现归并两个有序链表

    这篇文章主要介绍了c++如何实现归并两个有序链表,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • C语言简明讲解操作符++和--的使用方法

    C语言简明讲解操作符++和--的使用方法

    ++和--运算符分别是+=1和-=1的简写。设计这样两个运算符的本意是⽅便程序员,但i++和++i使⽤不恰当有时候会造成混淆,反倒令刚入门的C程序员有点混乱
    2022-04-04
  • C语言中的sscanf()函数使用详解

    C语言中的sscanf()函数使用详解

    这篇文章主要介绍了C语言中的sscanf()函数使用详解,文中附加了一道相关的ACM题目进行补充巩固,需要的朋友可以参考下
    2015-08-08
  • Qt编译OpenCV的实现步骤

    Qt编译OpenCV的实现步骤

    本文主要介绍了Qt编译OpenCV的实现步骤,通过详细的步骤和说明,帮助开发者在Qt环境中成功集成并编译OpenCV,从而为各类计算机视觉项目提供强大的支持,感兴趣的可以了解一下
    2024-01-01
  • 基于C语言实现创意多彩贪吃蛇游戏

    基于C语言实现创意多彩贪吃蛇游戏

    这篇文章主要介绍了如何利用C语言实现一个创意多彩贪吃蛇游戏,这是一个纯C语言外加easyx库的绘图函数制作而成的有趣小游戏,无需引入额外资源,感兴趣的可以动手尝试一下
    2022-08-08

最新评论