码迷,mamicode.com
首页 > 其他好文 > 详细

范围for循环

时间:2019-03-27 10:51:44      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:引用类型   代码   func   成员   for循环   effective   功能   类型   序列   


 

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循环

标签:引用类型   代码   func   成员   for循环   effective   功能   类型   序列   

原文地址:https://www.cnblogs.com/Maurice-code/p/10605544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!