• C++通过迭代修改字符串本身(auto类型说明符)


    以字符串这种支持

    for (declaration : expression)
    	statement
    

    这样for语句迭代的数据结构为例,我们看看auto关键字在类型推断中的作用。

    string s = "I LOVE YOU!";
    
    for (char ch : s){
       	cout << ch << endl;
    }
    

    输出:

    I LOVE YOU!
    

    这种情况下用不用auto都无所谓,因为这时候auto并不能减少代码量,但是一到复杂的循环时就可以体现出来了,因此最好还是用auto
    像上面那样对string进行遍历并不能改变其本身,chs中每个字符的副本拷贝。想要改变s本身,则要限定参与遍历的是引用:

    for (auto &ch : s) {
        ch = tolower(ch);
        cout << ch << endl;
    }
    

    输出:

    i love you!
    

    这样chs中每个字符的引用,对ch进行修改也就可以修改s本身了。
    for-each这样的语法应用于多维数组时,需要注意的是外层循环要使用引用:

    int array[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    
    for (auto &row : array){
        for (auto col : row)
            cout << col << " ";
        cout << endl;
    }
    

    如果row不是引用,那么它会被自动转化为对这个二维数组每一行的指针,成为了指针,内层循环对指针进行遍历就当然不合法了。
    下面就auto比较特殊的一点来举个栗子:

    int foo = 11;
    const int &a = 10;
    int *p = &foo;
    
    auto x = foo;//x是int
    auto y = a;//y是int,int类型的变量y当然可以用引用a来初始化,这里a的顶层const属性被移除。
    auto &yy = a;//yy是const int &,所以可以用a来对yy进行初始化。
    auto pp = p;//这个与下面一样,我暂时还不能搞懂
    auto *ppp = p;//ppp是int *,可以用p赋值初始化
    
    cout << y << endl;
    cout << yy << endl;
    cout << pp << endl;
    cout << ppp << endl;
    

    结果:

    10
    10
    0x61fefc
    0x61fefc
    

    发现没有,ppppp是一样的,这里涉及到auto的一些原理,我不是太清楚。而且auto定义的是引用时,初始化值顶层的const属性并不会移除,yy是个例子;auto定义的不是引用时,初始化值顶层的const属性会被移除,y就是个例子。
    我在v2ex发了个帖子是关于这个的,想看看的可以移步v2ex

    世事茫茫,光阴何其有限!
  • 相关阅读:
    1.17 Python基础知识
    反射
    面向对象——类
    异常处理
    面向对象——静态方法、类方法、属性法法,其他特殊方法
    面向对象——继承
    question
    configparser模块
    hashlib模块
    shelve模块
  • 原文地址:https://www.cnblogs.com/bobliao/p/10043108.html
Copyright © 2020-2023  润新知