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

posted @ 2018-11-30 11:18  bobliao  阅读(1044)  评论(0编辑  收藏  举报