C++11之基于范围的for循环

简介: C++11之基于范围的for循环

基于范围的for循环

C++98遍历方式

在C++98标准中,当我们遍历数组时,一般方法就是下标遍历和指针遍历。

  int arr[] = { 1,2,3,5,6 };
  // 下标遍历
  for(size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
  {
    std::cout << arr[i] << " ";
  }
  std::cout << std::endl;
  // 指针遍历
  int* p = arr;
  for(p = arr; p < arr + sizeof(arr) / sizeof(arr[0]); ++p)
  {
    std::cout << *p << " ";
  }
  std::cout << std::endl;

当然还有一种遍历方式,需要包含<algorithm>头文件的for_each遍历。参数依次是:起始地址、结束地址、回调函数。地址是左闭右开区间[begin,end)

#include <iostream>
#include <algorithm>
void print(const int& elem)
{
  std::cout << elem << " ";
}
// for_each遍历
std::for_each(arr, arr + sizeof(arr) / sizeof(arr[0]), print);
std::cout << std::endl;


C++11 范围遍历

上述的几种遍历方式的共同点就是都需要写明循环的一个范围。对于我们需要完整的遍历一个有范围的集合/数组时,完全可以让编译器自动计算出范围。因此C++11引入了基于范围的for循环


格式:for(迭代的变量:数组){}

现在我们使用范围遍历对数组进行遍历。

  for(const int& e: arr)
  {
    std::cout << e << " ";
  }
  std::cout << std::endl;


然后我们可以在这里加入auto自动类型(C++11),遍历将会更加简单。

for (const auto& elem : arr)
  {
    std::cout << elem << " ";
  }
  std::cout << std::endl;


但范围遍历不能适用于所有情况,范围遍历的条件就是循环迭代的范围必须是可确定的。例如stringarrayvectorlistmap等都是可以正常使用的。而用户自定义写的类则需要自行提供自增运算符重载赋值运算符重载

  int* ptr = arr;
  for(auto elem : ptr)
  {
    std::cout << elem << " ";
  }
  std::cout << std::endl;


遍历没有明确范围的数组,是不能使用范围遍历方法的。

在使用范围遍历的方式遍历stl的容器时,如果你使用auto声明迭代器的变量,那么推导出来的类型是迭代器解引用后的对象。

  std::vector<int> vec{ 1,5,6,9,4 };
  for (const auto iter = vec.begin(); iter != vec.end(); ++iter)
  {
    std::cout << *iter << " ";
  }
  std::cout << std::endl;
  for(const auto& elem : vec)
  {
    std::cout << elem << " ";
  }
  std::cout << std::endl;


这里就需要注意了前者iter类型是迭代器对象,后者elem是解引用后的对象。

目录
相关文章
|
2月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
2月前
|
程序员 C++
C++编程:While与For循环的流程控制全解析
总结而言,`while`循环和 `for`循环各有千秋,它们在C++编程中扮演着重要的角色。选择哪一种循环结构应根据具体的应用场景、循环逻辑的复杂性以及个人的编程风格偏好来决定。理解这些循环结构的内在机制和它们之间的差异,对于编写高效、易于维护的代码至关重要。
69 1
|
2月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
4月前
|
存储 程序员 C++
【C++小知识】基于范围的for循环(C++11)
【C++小知识】基于范围的for循环(C++11)
|
5月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
|
6月前
|
算法 程序员 编译器
C++的四类循环分享
C++的四类循环:Entry or Exit controlled, Ranged-based or For_each
|
6月前
|
C++
C++一分钟之-循环结构:for与while循环
【6月更文挑战第18天】在C++中,`for`循环适合已知迭代次数,如数组遍历;`while`循环适用于条件驱动的未知次数循环。`for`以其初始化、条件和递增三部分结构简洁处理重复任务,而`while`则在需要先检查条件时更为灵活。常见错误包括无限循环和逻辑错误,解决办法是确保条件更新和正确判断。了解两者应用场景及陷阱,能提升代码效率和可读性。
69 6
|
6月前
|
C语言 C++ 容器
c++primer plus 6 读书笔记 第五章 循环和关系表达式
c++primer plus 6 读书笔记 第五章 循环和关系表达式
|
6月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
49 0
|
6月前
|
存储 安全 编译器
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字
39 0