【C++】基于范围的for循环 (C++11)

简介: 【C++】基于范围的for循环 (C++11)

一、范围for的基本语法

在C++98中如果要遍历一个数组,可以按照以下方式进行:

#include<iostream>
using namespace std;
void TestFor()
{
  int array[] = { 1, 2, 3, 4, 5 };
  for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i)
    cout << array[i] << " ";
  cout << endl;
}
int main()
{
  TestFor();
  return 0;
}

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。

for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。

看范围 for 语句的定义:

for (declaration : expression)

  statement

其中,expression部分是个序列,declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。

代码实例

#include<iostream>
using namespace std;
void TestFor2()
{
  int array[] = { 1, 2, 3, 4, 5 };
  //定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
  for (auto e : array)
    e *= 2;
  for (auto e : array)
    cout << e << " ";
}
int main()
{
  TestFor2();
  return 0;
}

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

二、范围for中使用引用 (一些奇葩的问题)

看了上面的代码我们如果想利用范围for去改变数组中的值那我们应该怎么办呢?其实很好办我们只需要范围for里面的变量改成引用类型就行了。

例如:

#include<iostream>
using namespace std;
void TestFor3()
{
  int array[] = { 1, 2, 3, 4, 5 };
  //定义一个变量 e 然后每次都从array取数据赋值给e,自动判断结束
  for (auto& e : array)
  {
    e *= 2;
    cout << e << " ";
  }
}
int main()
{
  TestFor3();
  return 0;
}

看到这里如果你细心的话就会想:“这里面引用变量 e 怎么能够改变绑定呢?”实际上,范围for中的变量 e是每次迭代,e变量会被重新创建,所以这里的引用相当于不断地被初始化。

当然同样在for()循环中还有一个例子与这里变量 e 的创建方式相同,还有一个例子与这里变量 e 的创建方式不同,

①相同

#include<iostream>
using namespace std;
int main()
{
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    int a = 10;
    cout << a << " ";
    a++;
  }
  return 0;
}

这是因为a是局部变量,每次重新循环,a都会重新创建,和上面的范围for中使用引用类似。

②不同

在for()循环的初始化列表中创建的变量不会每次重新循环时会重新创建,但是for()循环结束时,在for()循环的初始化列表中创建的变量也会消失。

#include<iostream>
using namespace std;
int main()
{
  for (int i = 0; i < 10; i++)
  {
    cout << i << " ";
  }
  return 0;
}

讨论

范围for中的变量的创建与上面正常for()循环的第一种方式相像,可能它们的实现方式一样,这个我不太了解,如果有明白的小伙伴可以评论区一起讨论一下。

三、范围for的使用条件

  • for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围; 对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
    注意:以下代码就有问题,因为函数传参不会传数组,数组名代表首元素的地址,因此for的范围无法确定。
void TestFor(int array[])
{
  for(auto& e : array)
    cout<< e <<endl;
}
相关文章
|
7月前
|
编译器 C++ 容器
【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)
C++11为C++带来了革命性变化,引入了列表初始化、右值引用、移动语义、类的新默认成员函数和lambda表达式等特性。列表初始化统一了对象初始化方式,initializer_list简化了容器多元素初始化;右值引用和移动语义优化了资源管理,减少拷贝开销;类新增移动构造和移动赋值函数提升性能;lambda表达式提供匿名函数对象,增强代码简洁性和灵活性。这些特性共同推动了现代C++编程的发展,提升了开发效率与程序性能。
245 12
|
9月前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
181 1
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
422 1
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
137 0
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
存储 程序员 C++
【C++小知识】基于范围的for循环(C++11)
【C++小知识】基于范围的for循环(C++11)
|
编译器 C语言 C++
【C++关键字】指针空值nullptr(C++11)
【C++关键字】指针空值nullptr(C++11)
|
存储 编译器 C++
【C++关键字】auto的使用(C++11)
【C++关键字】auto的使用(C++11)
|
存储 算法 编译器
【C++11】C++11深度解剖(下)
【C++11】C++11深度解剖(下)
109 0