范围for循环

Posted maurice-code

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了范围for循环相关的知识,希望对你有一定的参考价值。


 

1、C++使用如下方法遍历一个容器:

#include "stdafx.h"
#include<iostream>
#include<vector>

int main()
{
    std::vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);

    for (auto it = arr.begin(); it != arr.end(); it++)
    {
        std::cout << *it << std::endl;
    }

    return 0;
}

2、同时使用std::for_each可以完成同样的功能(在头文件 #include <algorithm> 中),但是for_each的代码更简洁。

for_each事实上是个function template,其实质如下[effective STL item 41]:

template<typename InputIterator, typename Function>
Function for_each(InputIterator beg, InputIterator end, Function f) {
  while(beg != end) 
    f(*beg++);
}

使用for_each循环遍历如下:

#include "stdafx.h"
#include<algorithm>
#include<iostream>
#include<vector>

void func(int n)
{
    std::cout << n << std::endl;
}

int main()
{
    std::vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);

    std::for_each(arr.begin(), arr.end(), func);

    return 0;
}

3、C++11新标准引入了更简单的for语句,这种语句可以遍历容器或其它序列的所有元素。范围for语句(rang for statement)的语法形式是:

for (declaration : expression)
    statement

expression表示的必须是一个序列,比如用花括号括起来的初始值列表、数组或者vector或string等类型的对象,这些类型的共同特点是拥有能返回迭代器的begin和end成员。

declaration定义一个变量,序列中的每个元素都能转换成该变量的类型。确保类型相容最简单的办法是使用auto类型说明符,这个关键字可以令编译器帮助我们指定合适的类型。如果需要对序列中的元素执行写操作,循环变量必须声明成引用类型。

每次迭代都会重新定义循环控制变量,并将其初始化成序列中的下一个值,之后才会执行statement。像往常一样,statement可以之一套单独的语句也可以是一个块。所有元素都处理完毕后循环终止。

范围for语句的定义来源于与之等价的传统for语句:

for (auto beg = v.begin(), end = v.end(); beg != end; ++beg ){
    auto &r = *beg;     //r必须是引用类型,这样才能对元素执行写操作
    r *= 2;    //将v中每个元素的值翻倍
}

for循环新用法:

#include "stdafx.h"
#include<iostream>
#include<vector>

int main()
{
    std::vector<int> arr;
    arr.push_back(1);
    arr.push_back(2);

    for (auto n : arr)
    {
        std::cout << n << std::endl;
    }

    return 0;
}

 

以上是关于范围for循环的主要内容,如果未能解决你的问题,请参考以下文章

基于范围的 for 循环与常规迭代器 for 循环

如何在Django视图中使用for循环返回每次迭代[关闭]

我如何在 for 循环外使用 for 循环范围变量形式?

如何使用引导程序和 for 循环在 django 中创建电影片段?

for循环结构

Visual Studio 中基于 For 循环的 C++17 广义范围