C++基于范围的for循环详解
C++ 11提供了一个特殊版本的 for 循环,在很多情况下,它都可以简化数组的处理,这就是基于范围的 for 循环。在使用基于范围的 for 循环处理数组时,该循环可以自动为数组中的每个元素迭代一次。
例如,如果对一个 8 元素的数组使用基于范围的 for 循环,则该循环将迭代 8 次。因为基于范围的 for 循环可以自动知道数组中元素的个数,所以不必使用计数器变量控制其迭代,也不必担心数组下标越界的问题。
基于范围的 for 循环使用了一个称为范围变量的内置变量。每次基于范围的 for 循环迭代时,它都会复制下一个数组元素到范围变量。例如,第一次循环迭代,范围变量将包含元素 0 的值;第二次循环迭代,范围变量将包含元素 1 的值,以此类推。
以下是基于范围的 for 循环的一般格式:
例如,假设已经定义了以下数组:
所以,该代码将产生以下输出结果:
要将范围变量声明为引用变量,可以在循环头的范围变量名称前面添加一个
相比之下,第 20 行中的变量名前面就没有
注意,引用范围变量也可以使用 auto 关键字。例如,上面程序中的 for 循环也可以写成如下的形式:
例如,如果对一个 8 元素的数组使用基于范围的 for 循环,则该循环将迭代 8 次。因为基于范围的 for 循环可以自动知道数组中元素的个数,所以不必使用计数器变量控制其迭代,也不必担心数组下标越界的问题。
基于范围的 for 循环使用了一个称为范围变量的内置变量。每次基于范围的 for 循环迭代时,它都会复制下一个数组元素到范围变量。例如,第一次循环迭代,范围变量将包含元素 0 的值;第二次循环迭代,范围变量将包含元素 1 的值,以此类推。
以下是基于范围的 for 循环的一般格式:
for (dataType rangeVariable : array)
statement;
- dataType:是范围变量的数据类型。它必须与数组元素的数据类型一样,或者是数组元素可以自动转换过来的类型。
- rangeVariable:是范围变量的名称。该变量将在循环迭代期间接收不同数组元素的值。在第一次循环迭代期间,它接收的是第一个元素的值;在第二次循环迭代期间,它接收的是第二个元素的值;以此类推。
- array:是要让该循环进行处理的数组的名称。该循环将对数组中的每个元素迭代一次。
- statement:是在每次循环迭代期间要执行的语句。要在循环中执行更多的语句,则可以使用一组大括号来包围多个语句。
例如,假设已经定义了以下数组:
int numbers[] = {3, 6, 9};
可以使用基于范围的 for 循环来显示 numbers 数组的内容。语句如下:for(int val : numbers) { cout << "The next value is "; cout << val << endl; }因为 numbers 数组有 3 个元素,所以该循环将迭代 3 次。第一次它迭代时,val 变量将接收 numbers[0] 中的值;在第二次循环迭代期间,它将接收 numbers[1] 的值;在第三次循环迭代期间,它将接收 numbers[2] 的值。
所以,该代码将产生以下输出结果:
The next value is 3
The next value is 6
The next value is 9
for (auto val : numbers) { cout << "The next value is "; cout << val << endl; }下面的程序使用了基于范围的 for 循环来显示一个 string 变量的元素。
//This program demonstrates the range-based for loop #include <iostream> #include <string> using namespace std; int main () { string planets []= { "Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto(a dwarf planet)" }; // Display the values in the array cout << "Here are the planets: \n "; for (string val : planets) cout << val << endl; return 0; }程序输出结果为:
Here are the planets:
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune
Pluto(a dwarf planet)
使用基于范围的 for 循环来修改数组
当基于范围的 for 循环执行时,其范围变量将仅包含一个数组元素的副本。因此,不能使用基于范围的 for 循环来修改数组的内容,除非将范围变量声明为一个引用。引用变量是其他值的一个别名,任何对于引用变量的修改都将实际作用于别名所代表的值。要将范围变量声明为引用变量,可以在循环头的范围变量名称前面添加一个
&
符号。下面程序即显示了这样一个示例,它使用了基于范围的 for 循环来将用户输入的数据存储到一个数组中。
//This program uses a range-based for loop //to modify the contents of an array. #include <iostream> using namespace std; int main () { const int SIZE = 5; int numbers[SIZE]; //Get values for the array. for (int &val : numbers) { cout << "Enter an integer value: "; cin >> val; } // Display the values in the array. cout << "\nHere are the values you entered: \n"; for (int val : numbers) cout << val << " "; cout << endl; return 0; }程序输出结果:
Enter an integer value: 10
Enter an integer value: 20
Enter an integer value: 30
Enter an integer value: 40
Enter an integer value: 50
Here are the values you entered:
10 20 30 40 50
&
符号,这表示它被声明为引用变量。当循环执行时,val 变量将不再只是数组元素的副本,而是变成了元素本身的别名。因此,对 val 变量作出的任何修改都会实际作用于它当前引用的数组元素。相比之下,第 20 行中的变量名前面就没有
&
符号,这是因为在此无须将 val 声明为引用变量。该循环只是要显示数组元素,而不是改变它们。基于范围的 for 循环和常规 for 循环对比
基于范围的 for 循环可用于需要遍历数组所有元素的任何情形,并且不需要使用元素下标。但是,如果出于某些目的需要使用元素下标时,基于范围的 for 循环就不能使用了。另外,如果循环控制变量被用于访问两个或两个以上不同数组的元素,那么它也不适合使用。在这些情况下,可以使用常规 for 循环。注意,引用范围变量也可以使用 auto 关键字。例如,上面程序中的 for 循环也可以写成如下的形式:
for (auto &val : numbers) { cout << "Enter an integer value: "; cin >> val; }
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算