基于范围的for循环

目录

1 .基于范围的for循环

c++98中,若要访问一个数组中的数据元素,则需采用循环和下标的方式输出数组中的内容。
如:

/*************************************************************************
 * File Name: testFor.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      2412799512@qq.com 
 * Created Time: 2018年04月11日 星期三 01时46分57秒
 ************************************************************************/

#include<iostream>
#include<algorithm>
using namespace std;
int main(int argc,char **argv)
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    //1.采用数组下标的方式
    for (auto i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
    {   
        if (i % 10 == 0)
            cout << endl;
        cout << "arr[" << i << "]" << arr[i] << " ";
    }   


结果:
arr[0]1 arr[1]2 arr[2]3 arr[3]4 arr[4]5 arr[5]6 arr[6]7 arr[7]8 arr[8]9 arr[9]10 

     //2.采用指针的方式
    int *pTr = NULL;
    int j = 0;
    for (pTr = arr; pTr < arr + sizeof(arr) / sizeof(arr[0]); ++pTr,++j)
    {   
        if (j % 10 == 0)
            cout << endl;
        cout << "arr[" << j << "]" << *pTr << " ";
    } 

结果:
arr[0]1 arr[1]2 arr[2]3 arr[3]4 arr[4]5 arr[5]6 arr[6]7 arr[7]8 arr[8]9 arr[9]10 

    //3.通过for_each算法输出  
int outPut(int &val){ cout << "arr[" << val << "]" << val << " ";}

     for_each(arr,arr+sizeof(arr)/sizeof(arr[0]),outPut);
输出结果:
arr[1]1 arr[2]2 arr[3]3 arr[4]4 arr[5]5 arr[6]6 arr[7]7 arr[8]8 arr[9]9 arr[10]10
    return 0;
}

for_each算法中使用了“迭代器”(迭代器就是指针),其内部包含了自增操作的概念,所以不需要写上++p指针,但是对于该循环体得给出其界限范围,这是比较麻烦的,也是比较容易出错的。

1.1 C++11新特性 基于范围的for循环

采用c++11新特性中的基于范围for循环,不必去操心数组越界(边界)问题,因此非常的方便,特别是在项目开发中。

语法形式:
for(declaration:expression)
{
    statement
}

其中:
expression部分表示一个对象,用于表示一个序列。
declaration部分负责定义一个变量,该变量将被用于访问序列中的基础元素。
每次迭代,declaration部分的变量会被初始化为expression部分的下一个
元素值。

示例1:

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    for (auto val : arr)
    {
        cout << val << " ";
    }
    system("pause");
    return 0;
}

输出结果:
1 2 3 4 5 6 7 8 9 10 

示例2:
若迭代器变量的值希望能够在for中被修改,可以采用引用&的方式;

#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    for (auto &val : arr)
    {
        if (val == 5)
        {
            val += 1;
        }
        cout << val << " ";
    }
    system("pause");
    return 0;
}

输出结果:
1 2 3 4 5 6 6 7 8 9 10

示例3:
对于STL标准模板库也同样适用。

#include<iostream>
#include<stdlib.h>
#include<string>
#include<vector>
using namespace std;
int main()
{
    vector<int> arr;
    arr.push_back(1);
    arr.push_back(3);
    arr.push_back(5);
    arr.push_back(7);
    arr.push_back(9);
    for (auto &val : arr)
    {
        cout << val << " ";
    }
    system("pause");
    return 0;
}

输出结果:
1 3 5 7 9 

示例4.

#include<iostream>
#include<stdlib.h>
#include<string>
#include<map>
using namespace std;
int main()
{
    map<int, string> arr;
    arr.insert(pair<int, string>(1, "hello"));
    arr.insert(pair<int, string>(2, "world."));
    for (auto &val : arr)
    {
        cout << val.first << "," << val.second << endl;
    }
    system("pause");
    return 0;
}

输出结果:
1,hello
2,world.

2.基于范围的for循环特点
(1)和普通循环一样,也可以采用continue跳出循环的本次迭代。
(2)用break来终止整个循环

3.基于范围的for循环使用的要求及依赖条件
(1)for循环迭代的范围是可以确定的;如数组的第一个元素和最后一个元素便构成了for选好的迭代范围。
(2)对于用户自定义的类,若类中定义便实现的有begin、end函数,则这个begin、end便是for循环的迭代范围。
(3)基于范围的for循环要求迭代器的对象实现:++ ==等操作符。
(4)对于STL标准模板库中(如:vector,set,list,map,queue,deque,string等)的各种容器使用“基于范围的for循环”是不会有
任何问题的,因为这些容器中都定义了相关操作。

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lixiaogang_theanswer/article/details/79969012
个人分类: C++11新特性
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭