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把变量类型 ...
随机推荐
- java之spring mvc之Controller配置的几种方式
这篇主要讲解 controller配置的几种方式. 1. URL对应 Bean 如果要使用此类配置方式,需要在XML中做如下样式配置 <!-- 配置handlerMapping --> & ...
- Java自学-控制流程 for
Java的for循环 for循环,和while一样,只是表达方式不一样 示例 1 : for 比较for和while public class HelloWorld { public static v ...
- 将windows共享文件夹挂载到Linux
今天想用docker部署下 .net core的 服务,需要把代码文件从windows传到linux,以前一直都是拖拽的,这次安装的系统没有图形界面, 所以到网上找到了下面的这种方法,将共享文件夹挂载 ...
- js对象及函数(四)
一.对象1.函数对象的创建方法一:使用new构造函数去创建构造函数对象eg: var obj = new Object(); //向对象里面添加属性或方法 obj.name = 'nzc'; obj. ...
- 用java语言将数据库中的数据表转换为xml文件的通用程序(细化)
转自:https://www.cnblogs.com/wudage/p/7650685.html 总是在网络上copy别人的源代码,今天我也贴出自己今天写的源码,相信这个程序会对大家在平时的工作中需要 ...
- 调用Hybris API时遇到的错误消息Cannot find user with uid如何解决
今天工作中试图调用Commerce Cloud的user creation API用代码创建Hybris用户时,遇到下面这个错误消息. 我觉得很奇怪,因为backoffice里能查到这个id为jerr ...
- Postgresql 常用操作
表所有者一括变更 select 'alter table public.'|| tablename ||' owner to appuser;' from pg_tables where tableo ...
- Centos7.3安装nexus-3.14.0-04
nexus-3.14.0-04的安装 nexus-3.14.0-04-unix.tar.gz 1.下载nexus 2.上传到服务器/root ...
- springboot禁用内置Tomcat的不安全请求方法
起因:安全组针对接口测试提出的要求,需要关闭不安全的请求方法,例如put.delete等方法,防止服务端资源被恶意篡改. 用过springMvc都知道可以使用@PostMapping.@GetMapp ...
- 米勒罗宾素数检测(Miller-Rabin)
适用范围:较大数的较快素性判断 思路: 因为有好的文章讲解具体原理(见参考文章),这里只是把代码的大致思路点一下,读完了文章如果还有些迷糊,可以参考以下解释 原理是费马小定理:如果p是素数,则a^(p ...