范围for语句的整理
1.如何处理stirng中的每个字符?(来自C++Primer中文版5th中P83)
使用基于范围的for语句,比如下面的例子,输出每个字符
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string s("Hello world!!!");
for (auto c : s)
cout<<c<<endl;
return 0;
}
2.修改序列中的元素,必须将循环变量申明为引用类型(来自C++Primer中文版5th中P83)
下面将整个string字符改写成大写,然后输出。
#include<iostream>
#include<string>
#include<cctype>
using namespace std;
int main(void)
{
string s("Hello world!!!");
for (auto &c : s)
c=toupper(c);
cout<<s<<endl;
return 0;
}
3.处理多维数组(来自C++Primer中文版5th中P116的练习题目)
由于编译器初始化时会将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的row类型就是int*,这样原来的for语句就是在一个int*中遍历,这是不合法的。而如果改成引用类型,就不会发生上述转换。
所以使用范围for语句处理多维数组的时候,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<iterator>
#include"Sales_item.h"
using namespace std;
int main(void)
{
//练习3.43
int ia[3][4] = { //三个元素,每个元素都是大小为4的数组
{0,1,2,3}, //第1行的初始值
{4,5,6,7}, //第2行的初始值
{8,9,10,11} //第3行的初始值
};
//使用范围for语句管理迭代过程
for (auto &row : ia)
for (int &col : row)
cout << col << endl;
cout << endl;
//使用普通for语句,使用下标运算符
for (size_t row = 0; row < 3; row++)
for (size_t col = 0; col < 4; col++)
cout << ia[row][col] << endl;
cout << endl;
//使用普通for语句,使用指针
int(*p)[4] = ia; //p指向含有4个整数的数组
for (; p != ia + 3; p++)
for (int *q = *p; q != *p + 4; q++)
//q指向含有4个整数数组的首元素,也就是说,q指向一个整数
cout << *q << endl;
cout << endl;
//vector<int>::difference_type atp;
//声明difference_type的时候需要指定具体类型,和迭代器类似
//difference_type是带符号类型的
//练习3.44
using int_array = int[4]; //新标准下类型别名是声明,参见2.5.1节P60
//此时将类型是"4个整数的数组"命名成了int_array
typedef int int_array[4]; //与上一语句等价的typedef声明,参见2.5.1节P60
//输出ia中每个元素的值,每个内层数组各占一行
for (int_array *p = ia; p != ia + 3; p++)
for (int *q = *p; q != *p + 4; q++)
cout << *q << endl;
cout << endl;
//练习3.45
//使用范围for语句管理迭代过程
for (auto &row : ia)
for (int &col : row)
cout << col << endl;
cout << endl;
return 0;
}
4.为什么不能通过范围dor语句向vector(或者其他容器)中添加元素
范围for语句的语法形式为
for(declaration:expression)
statement
其中expression必须为一个序列,为什么呢?
范围for语句的定于来源与等价的传统for语句:比如下面这个让vector中元素翻倍的循环,范围for语句还是依赖于迭代器实现的。
vector<int>v = { 1,23,56 };
for (auto &r : v) //范围for
r *= 2;
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg){ //传统for
auto &r = *beg;
r *= 2;
}
这就是说,其实在范围for语句中,预存了end()的值。一旦向序列中增加或者删除元素,end函数有可能变得无效,循环就可能不是预期中的了。
因为这个时候对容器的增删操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的后一个位置。
5.为什么需要对序列中的元素执行写操作的时候,循环变量必须声明成引用类型?
- 当传入的迭代参数类型为非引用时,做的是值传递,值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值,所以才修改无效。
- 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量,所以修改有效。
- 这里讲解了几种关于参数传递的区别http://xinklabi.iteye.com/blog/653643
范围for语句的整理的更多相关文章
- Python第一周基本语句学习整理
目录 Python第一周基本语句学习整理 一.字符串切割 二.体重单位转换 三.计算器的实现 四.猜年龄游戏 Python第一周基本语句学习整理 一.字符串切割 代码实现: s = 'luowenxi ...
- SQL语句的整理
mysql语句的整理 1.SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法.但是 SQ ...
- Oracle数据库高效sql语句的整理
业务需求说明:由于之前公司后台APP端有一个document表,该表中包含了所有的信息,新的需求就是通过该表创建出一个新的用户表(usertable)和一个档案表(document,该表只保留原doc ...
- 常用SQL语句汇总整理
1.SQL 插入语句得到自动生成的递增ID 值 insert into Table1(Name,des,num) values (''ltp'',''thisisbest'',10); select ...
- SQL语句简单整理
转载原文:http://blog.sina.com.cn/s/blog_48df31d901017c6o.html 1.用户 - 查看当前用户的缺省表空间 select username,defaul ...
- 关于MySql经典高频查询语句的整理
一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...
- 转sql server新增、修改字段语句(整理)
添加字段的SQL语句的写法: 通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] ...
- XSS注入常用语句(整理)
<script>alert('hello,gaga!');</script> //经典语句,哈哈! >"'><img src="javas ...
- SQL Server简单语句/待整理
数据库对象:表Table,视图View,存储过程Stored Procedure,触发器Trigger 关系:1关系=1二维表,1关系有1关系名.1关系=1表对象 属性/字段: 二维表中垂直方向的列 ...
随机推荐
- javascript:中文等字符转成unicode
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- vue+rest-framework前后端分离整合(二)
一.基于api前端显示课程详细信息 1.调整Course.vue模块 <template> <div> <h1>课程列表</h1> <div v- ...
- Android 自定义View之自绘控件
首先要提前声明一下,我对于自定义View的理解并不是很深,最近啃了几天guolin博主写的关于自定义View的博客,讲的非常棒,只不过涉及到源码和底层的一些东西,我自己就懵逼了,目前只是会了关于自定义 ...
- PHP 数字转汉字函数
/** * 数字转汉字描述 */ function numToStr($num) { // 判断正确数字 if (!preg_match('/^(\d*)(\.\d+)?$/', $num)) ret ...
- mysql的sql_mode介绍和修改
原文链接: http://blog.csdn.net/wulantian/article/details/8905573 mysql目录下有一个配置文件my.conf. mysql数据库有一个环境 ...
- centos apache 腾讯云ssl证书配置
首先向证书机构申请https证书,会得到证书和私钥,这里我以腾讯云证书安装为例(非常简单) 分两步走 1.申请 点击腾讯云控制台->产品模块下的ssl证书管理->点击申请证书(免费的,不要 ...
- Hadoop fs命令(转)
最近使用hive做一些etl工作,除了日常sql的编写,了解hadoop及hive的一些底层原理性质的东西包括调优非常有必要,一次hive调优就把原来的零散文件做了合并.首先记下hadoop常用的命令 ...
- 如何查找Fiori UI上某个字段对应的后台存储表的名称
今天微信群里有朋友问到这个问题. 如果是SAPGUI里的事务码,比如MM01,对于开发者来说这个任务非常容易完成. 比如我想知道下图"Sales Unit"这个字段的值到底保存在哪 ...
- POJ-3579 Median---二分第k大(二分套二分)
题目链接: https://cn.vjudge.net/problem/POJ-3579 题目大意: 求的是一列数所有相互之间差值的序列的最中间的值是多少. 解题思路: 可以用二分套二分的方法求解第m ...
- Haskell 与范畴论-函子、态射、函数
范畴论基本概念 如果你是第一次听说范畴论(category theory),看到这高大上的名字估计心里就会一咯噔,到底数学威力巨大,光是高等数学就能让很多人噩梦连连.和搞编程的一样,数学家喜欢将问题不 ...