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进行遍历并不能改变其本身,ch是s中每个字符的副本拷贝。想要改变s本身,则要限定参与遍历的是引用:
for (auto &ch : s) {
ch = tolower(ch);
cout << ch << endl;
}
输出:
i love you!
这样ch是s中每个字符的引用,对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
发现没有,pp与ppp是一样的,这里涉及到auto的一些原理,我不是太清楚。而且auto定义的是引用时,初始化值顶层的const属性并不会移除,yy是个例子;auto定义的不是引用时,初始化值顶层的const属性会被移除,y就是个例子。
我在v2ex发了个帖子是关于这个的,想看看的可以移步v2ex。
C++通过迭代修改字符串本身(auto类型说明符)的更多相关文章
- C++11 auto类型说明符的使用
编程的时候常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型.然而做到这一点很难,有时候根本做不到.为了解决这个问题.C++11新标准引入了auto类型说明符,用它就 能让编 ...
- C++ auto类型说明符
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50864612 编程时常常需要把表达式的 ...
- auto类型说明符的注意事项
1.auto类型说明符,是C++11标准下的,它能让编译器自行判断表达式的类型. 2.auto也能在一条语句上声明多个变量,但是,该语句上的多个变量的类型,必须一致. 3.编译器推断出来auto类型可 ...
- auto类型说明符
auto让编译器通过出初始值来推算变量的类型,显然,auto定义的变量必须有初始值: //由val1和val2相加的结果可以推断出item的类型 auto item = val1 + val2;//i ...
- (2)左右值初探与auto类型说明符
这篇文章的起因是下面这两段代码,出自<C++ primer 5th>中文版P62页: auto &h =42;//错误,不能为非常量引用绑定字面值 const auto & ...
- C++ decltype类型说明符(尾置返回类型使用)
转自https://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 decltype 类型说明符生成指定表达式的类型.在此过程中,编译器分析 ...
- C++ decltype类型说明符
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 declt ...
- OCCI的迭代修改
传统的在执行多行DML(INSERT.UPDATE.DELETE)时,我们是多次调用executeUpdate():注意!当我们调用一次此函数时,则执行一次网络往返,当数据量大时则效率非常低.不过 O ...
- 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值
这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...
随机推荐
- SSO实现机制
引言 单点登录有许多开发商提供解决方案,本文以yale大学SSO开源项目CAS为例,介绍单点登录实现机制. 术语解释 SSO-Single Sign On,单点登录 TGT-Ticket Granti ...
- Deployment.spec.selector.matchLables实验解释
原文:https://cloud.tencent.com/developer/article/1394657 Deployment.spec.selector.matchLables实验解释 作者: ...
- The XOR Largest Pair(tire树)
题目 The XOR Largest Pair 解析 一年前听学长讲这道题,什么01trie,好高级啊,所以没学,现在一看.... 看到xor就应该想到二进制,一看数据\(A_i< 2^{31} ...
- Git for Windows. 国内镜像
感谢https://github.com/waylau/git-for-win Git for Windows. 国内直接从官网(http://git-scm.com/download/win)下载比 ...
- 【开发笔记】- QQ消息轰炸
1.右键新建一个文本文件: 2.打开记事本将如下代码复制过去: On Error Resume Next Dim wsh,ye set wsh=createobject("wscript.s ...
- Java 格式化日期、时间
有三种方法可以格式化日期.时间. 1.使用DateFormat类 获取DateFormat实例: DateFormat.getDateInstance() 只能格式化日期 2019年5 ...
- 捡回reset的未提交修改
使用 Reflog 如果一開始沒有記下來 Commit 的 SHA-1 值也沒關係,Git 裡有個 reflog 指令有保留一些紀錄.再次借用上個章節的例子,但這次我改用 --hard 模式來進行 r ...
- 【等待事件】等待事件系列(5.1)--Enqueue(队列等待)
[等待事件]等待事件系列(5.1)--Enqueue(队列等待) 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...
- jquery.widget开发(1)
jquery.widget是挂件,通过挂件模式挂载在jquery对象上,其实本质上也就是用了$.fn.extend和$.extend的扩展. http://blog.sina.com.cn/s/blo ...
- CentOS安装MySQL8.x
MySQL的安装 (4,5,6可省略) 声明:CentOS版本为7.6,安装的MySQL版本为8.0.17 1. 首先要卸载掉本机自带的mysql相关,包括MariaDB. rpm -pa | gre ...