zoukankan      html  css  js  c++  java
  • 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

    世事茫茫,光阴何其有限!
  • 相关阅读:
    HDU 1560 DNA sequence (迭代加深搜索)
    POJ-1077 HDU 1043 HDU 3567 Eight (BFS预处理+康拓展开)
    CSUST 1011 神秘群岛 (Dijkstra+LCA)
    LCA 倍增
    HDU 1003 Max Sum 求区间最大值 (尺取法)
    Codeforce 867 C. Ordering Pizza (思维题)
    POJ 3349 Snowflake Snow Snowflakes (Hash)
    POJ 2774 Long Long Message (Hash + 二分)
    POJ 1200 Crazy Search (Hash)
    前端面试总结(转)
  • 原文地址:https://www.cnblogs.com/bobliao/p/10043108.html
Copyright © 2011-2022 走看看