• C++ for循环中有冒号,for(auto &c:s)与for(auto c:s)的用法


    常规思路,我们想要输出一个数组的全部元素时,往往采用以下的方法:

    //随机定义的数组
    int array[10] = { 54, 23, 78, 9, 15, 18, 63, 33, 87, 66 };
    
    for (int i = 0; i < 10; i++) {
    	cout << array[i] << " ";		//输出:54 23 78 9 15 18 63 33 87 66
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在C++11标准中,我们可以在for循环使用冒号 : 来简化这一过程:

    //随机定义的数组
    int array[10] = { 54, 23, 78, 9, 15, 18, 63, 33, 87, 66 };
    	
    for (auto a : array) {
    	cout << a << " ";		//输出:54 23 78 9 15 18 63 33 87 66
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    a在每次循环中,依次等于array[i]。上面两个例程的结果是相同的。


    关于上述特殊for循环用法,有以下注意点:
    1、需要编译器支持C++11及以上的标准

    2、形如 for(auto c:s) 的格式,auto可以是别的数据类型比如char,int,const char*等等各类数据类型,可以是自定义的数据类型。c是一个变量名称,可以按变量名规则任意定义;s是一个容器名称,可以是一个数组,可以是string等等。

    3、for(auto &c:s)与for(auto c:s)的区别1:
    for(auto c:s)中b为一个容器,效果是利用c遍历并获得s容器中的每一个值,但是c无法影响到s容器中的元素。
    for(auto &c:s)中加了引用符号,可以对容器中的内容进行赋值,即可通过对c赋值来做到容器s的内容填充。

    如下示例:

    #include 
    #include 
    using namespace std;
    
    int main(void)
    {
        string s("hello world");
    
        for (auto c : s) {
            c = 't';
        }
    
        cout << s << endl; //结果为hello world
    
        for (auto& c : s) {
            c = 't';
        }
    
        cout << s << endl; //结果为ttttttttttt
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    可见不用&引用,不能使s中的字符改变成’t’。

    4、for(auto &c:s)与for(auto c:s)的区别2:
    使用for(auto &c:s)时,直接引用原字符串进行遍历操作。
    使用for(auto c:s)时,逻辑上会复制一个s字符串再进行遍历操作。
    由于复制一个字符串花费了大量的时间,所以第一种用法的程序执行速度要快于第二种用法。

    5、在for(auto &c:s)或for(auto c:s)中, auto用于for循环的作用:根据s的数据类型由编译器自动确定c的数据类型。

    在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int、char 等;但是在一些比较灵活的语言中,比如 C#、JavaScript、PHP、Python 等,程序员在定义变量时可以不指明具体的类型,而是让编译器(或者解释器)自己去推导,这就让代码的编写更加方便。C++11 为了顺应这种趋势也开始支持自动类型推导了!C++11 使用 auto 关键字来支持自动类型推导。

  • 相关阅读:
    Pytorch:一些常用代码
    维也纳国际酒店8月再签9大项目,中高端酒店凭何获市场热捧
    软件测试之对于测试的反思及思考
    Redis面试题【29】
    sessionStorage和localStorage 的区别和使用,具体与 session 区分
    python_基础语法(列表、列表基本操作)
    Auto.js中的脚本引擎
    Google Earth Engine(GEE)——evaluate实现一键批量下载研究区内的所有单张影像(上海市部分区域)
    Redisson-MultiLock使用
    【Boxplot】
  • 原文地址:https://blog.csdn.net/weixin_44788542/article/details/126260987