在for循环中基于复杂对象我们使用引用,这样可以避免对象拷贝,提升性能。
如果确认不会修改引用对象,请在前面加上const限定符。帮助编译器生成更加高效的代码。
如果是基础类型,直接使用值即可。
C++11引入了一种更简洁、统一的循环结构——基于范围的for循环(Range-based for loop),用于遍历容器和数组。让我们详细了解一下这个特性:
-
传统的for循环:
- 在C++11之前,我们使用以下结构来遍历数组或容器:
for (表达式1; 表达式2; 表达式3) { // 循环体 }
例如,下面的示例演示了如何使用传统的for循环遍历数组和容器:
#include <iostream> #include <vector> #include <string.h> using namespace std; int main() { char arc[] = "C++11"; int i; // 遍历普通数组 for (i = 0; i < strlen(arc); i++) { cout << arc[i]; } cout << endl; // 遍历vector容器 vector<char> myvector(arc, arc + 6); vector<char>::iterator iter; for (iter = myvector.begin(); iter != myvector.end(); ++iter) { cout << *iter; } return 0; }
程序执行结果为:C++11
-
基于范围的for循环:
- C++11引入了一种更简洁的语法格式:
for (declaration : expression) { // 循环体 }
其中:
declaration
:定义一个变量,该变量的类型为要遍历序列中存储元素的类型。可以使用auto
关键字自动推导变量类型。expression
:要遍历的序列,可以是普通数组、容器,或者使用大括号初始化的序列。
下面的示例展示了如何使用基于范围的for循环遍历之前定义的
arc
数组和myvector
容器:#include <iostream> #include <vector> using namespace std; int main() { char arc[] = "C++11"; // 遍历普通数组 for (char ch : arc) { cout << ch; } cout << '!' << endl; // 遍历vector容器 vector<char> myvector(arc, arc + 6); for (auto ch : myvector) { cout << ch; } cout << '!'; return 0; }
程序执行结果为:C++11!
注意:
- 在遍历字符串序列时,基于范围的for循环会遍历到字符串末尾的
'\\0'
(字符串的结束标志)。 - 新语法格式的for循环还支持遍历使用大括号初始化的列表,如
{1, 2, 3, 4, 5}
。 - 如果需要在遍历序列的同时修改元素的值,可以在declaration参数处定义引用形式的变量。123