C++基于范围的for循环(auto的使用)

基于范围的for循环

输出示例一

#include <iostream>
#include <string>
#include <vector>
#include <ctime>

using std::cout;
using std::endl;
using std::string;
using std::vector;


int main()
{
    clock_t startTime=0,endTime=0;
    startTime=clock();
    string Number[]={"Hello World","Hello I am Sangni"};
    string NumberA[2][2]={{"Hello My World","Hello I am Sangni"},
                          {"Yes I am sang","Hello I am computer"}};

    vector<vector<string>> str(2,vector<string>(Number,Number+2));
   //这里使用了vector容器的最后一个初始化函数
    for (auto x : NumberA[0])
    {//NumberA[0]为string数组第一行的地址,所以x将输出string数组第一行的两个元素
        cout << x <<endl;
    }
    cout<<endl;
    endTime=clock();
    cout << "Run Time=" << (double)(endTime-startTime)<< "ms" << endl;
    return 0;
}
  • 输出如下所示
    在这里插入图片描述

输出示例二

  • 如果将输出的for循环改为如下所示,其他部分不做改变
#include <iostream>
#include <string>
#include <vector>
#include <ctime>

using std::cout;
using std::endl;
using std::string;
using std::vector;


int main()
{
    clock_t startTime=0,endTime=0;
    startTime=clock();
    string Number[]={"Hello World","Hello I am Sangni"};
    string NumberA[2][2]={{"Hello My World","Hello I am Sangni"},
                                {"Yes I am sang","Hello I am computer"}};

    vector<vector<string>> str(2,vector<string>(Number,Number+2));
    for (auto x : NumberA[0][0])
    {//只有这里做了改动,将原来NumberA[0]变为了NumberA[0][0]
        cout << x <<endl;
    }
    cout<<endl;
    endTime=clock();
    cout << "Run Time=" << (double)(endTime-startTime)<< "ms" << endl;
    return 0;
}
  • 输出结果如下
    在这里插入图片描述

综上所述

  • auto用于基于范围的for循环时,x将被初始化为与NumberA[0]相同的类别(对于示例一而言,示例二同理)。

输出示例三

使用基于范围的for循环时,循环中对元素的访问和操作

  • C++面向对象的特性在这里有很好的体现,让我有一种在写MATLAB代码的错觉。C++真是一个伟大的语言。
#include <iostream>
#include <string>
#include <vector>
#include <ctime>

using std::cout;
using std::endl;
using std::string;
using std::vector;


int main()
{
    clock_t startTime=0,endTime=0;
    startTime=clock();
    const char NumberB[]="Hello World";
    string Number[]={"Hello World","Hello I am Sangni"};
    string NumberA[2][2]={{"Hello World","Hello I am Sangni"},
                          {"Yes I am sang","Hello I am computer"}};
    vector<vector<string>> str(2,vector<string>(Number,Number+2));
    for (auto x : Number)
    {
        if (x==str[0][0])
        {//这一句与MATAB中的用法极为相似
            cout<< "二维vector string数组测试通过" <<endl;
        }
        if (x==NumberA[0][0])
        {//这一句与MATAB中的用法极为相似
            cout << "二维string数组测试通过"<<endl;
        }
        if (x==NumberB)
        {//这一句与MATAB中的用法极为相似
            cout<< "一维字符串常量数组测试通过"<<endl;
        }
        if (x=="Hello World")
        {//这一句与MATAB中的用法极为相似
            cout << "字符串常量测试通过"<<endl;
        }
    }
    endTime=clock();
    cout << "Run Time=" << (double)(endTime-startTime)<< "ms" << endl;
    return 0;
}

输出结果:
在这里插入图片描述

  • 上述代码中,x属于传值,更改x后并不会更改Number的内容。如果将循环条件改为如下所示:
for (auto &x:Number)//这里表示x传引用
    {
        //.....
        //.....
        //.....
    }

此时更改x的同时,也会更改Number的内容。测试代码如下所示:

  • 传值:(" for (auto x:Number) ")
#include <iostream>
#include <string>
#include <vector>
#include <ctime>

using std::cout;
using std::endl;
using std::string;
using std::vector;


int main()
{
    clock_t startTime=0,endTime=0;
    startTime=clock();
    const char NumberB[]="Hello World";
    string Number[]={"Hello World","Hello I am Sangni"};
    string NumberA[2][2]={{"Hello World","Hello I am Sangni"},
                          {"Yes I am sang","Hello I am computer"}};
    vector<vector<string>> str(2,vector<string>(Number,Number+2));
    cout<<"更改前:"<<endl;
    cout << "Number[0]="<<Number[0]<<endl;
    cout << "Number[1]="<<Number[1]<<endl;
    for (auto x:Number)
    {
        if (x=="Hello World")
        x="Your are welcome";
        if (x=="Hello I am Sangni")
        x="Hello I am a computer";
    }
    cout<<"更改后:"<<endl;
    cout << "Number[0]="<<Number[0]<<endl;
    cout << "Number[1]="<<Number[1]<<endl;
    endTime=clock();
    cout << "Run Time=" << (double)(endTime-startTime)<< "ms" << endl;
    return 0;
}

输出结果:
在这里插入图片描述

  • 传引用:(" for (auto &x:Number) ")
#include <iostream>
#include <string>
#include <vector>
#include <ctime>

using std::cout;
using std::endl;
using std::string;
using std::vector;


int main()
{
    clock_t startTime=0,endTime=0;
    startTime=clock();
    const char NumberB[]="Hello World";
    string Number[]={"Hello World","Hello I am Sangni"};
    string NumberA[2][2]={{"Hello World","Hello I am Sangni"},
                          {"Yes I am sang","Hello I am computer"}};
    vector<vector<string>> str(2,vector<string>(Number,Number+2));
    cout<<"更改前:"<<endl;
    cout << "Number[0]="<<Number[0]<<endl;
    cout << "Number[1]="<<Number[1]<<endl;
    for (auto &x:Number)
    {
        if (x=="Hello World")
        x="Your are welcome";
        if (x=="Hello I am Sangni")
        x="Hello I am a computer";
    }
    cout<<"更改后:"<<endl;
    cout << "Number[0]="<<Number[0]<<endl;
    cout << "Number[1]="<<Number[1]<<endl;
    endTime=clock();
    cout << "Run Time=" << (double)(endTime-startTime)<< "ms" << endl;
    return 0;
}

输出结果:
在这里插入图片描述


版权声明:本文为weixin_37843779原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。