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

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=523035967&auto=1&height=66">

以字符串这种支持

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就是个例子。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值