范围for语句的整理

2018-03-11 20:45:32 Enterprise_ 阅读数 549更多

分类专栏: C++基础

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/Enterprise_/article/details/79519432

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.43int 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.44using int_array = int[4];   //新标准下类型别名是声明,参见2.5.1节P60//此时将类型是"4个整数的数组"命名成了int_arraytypedef 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)   //范围forr *= 2;
for (auto beg = v.begin(), end = v.end(); beg != end; ++beg){       //传统forauto &r = *beg;r *= 2;
}

这就是说,其实在范围for语句中,预存了end()的值。一旦向序列中增加或者删除元素,end函数有可能变得无效,循环就可能不是预期中的了。
因为这个时候对容器的增删操作使得保存在end中的迭代器失效了,不再指向任何元素,或者是尾元素的后一个位置。

5.为什么需要对序列中的元素执行写操作的时候,循环变量必须声明成引用类型?

  • 当传入的迭代参数类型为非引用时,做的是值传递,值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值,所以才修改无效。
  • 而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量,所以修改有效。
  • 这里讲解了几种关于参数传递的区别http://xinklabi.iteye.com/blog/653643

范围for语句的整理相关推荐

  1. DB2 SQL语句归纳整理(一)

    DB2 SQL语句归纳整理 增删改查整理 添加 INSERT INTO docsummitinfo(APPID,DOCRESULT,EXITVALUE,LOGDESC,DOCFLAG) (SELECT ...

  2. mysql操作数据库语句大全_常用的Mysql数据库操作语句大全整理

    一.用户管理: 1.新建用户: >create user name identified by 'ssapdrow'; 2.更改密码: >set password for name=pas ...

  3. sql server新增、修改字段语句(整理)

    文章来源: 百度知道:https://zhidao.baidu.com/question/437611593.html jcx5083761的专栏:https://blog.csdn.net/jcx5 ...

  4. sql语句练习题整理

    一.现有数据库casemanage中表结构如下图 TABLENAME:afinfo Id name age birth sex memo 1 徐洪国 37 1979-03-23 男 高中 2 王芳芳 ...

  5. DQL查询语句内容整理

    select * from t_hq_ryxx;select bianh,xingm from t_hq_ryxx;--为字段名定义别名 select bianh as 编号,xingm as 姓名 ...

  6. SQL-Server 语句存档整理

    剔除掉重复数据,只显示没有重复的列. USE database_name GO SELECT DISTINCT [column_name] FROM  [dbo].[table_name] USE d ...

  7. django项目中涉及到的一些常用sql语句学习整理

    1.  查询数据库中yanfriends_article表中所有的为'201'的cid字段,查询结果按照ctime字段(本身为text,转为int类型比较)的递增展示 select * from ya ...

  8. 绝妙的Python语句搜集整理

    1. dict.get(key,func)(param) 例: def func1(param):print(f'func1: {param}')def func2(param):print(f'fu ...

  9. mysql常用基础语句(整理)

    目录 DOS命令操作 MySQL服务启动 MySQL登录 MySQL退出 乱码: Mysql介绍 MySql优势 版本 数据类型 2 种注释 约束及属性 常用函数 数据库 表 主外键 查询 普通查询 ...

最新文章

  1. 开源!开源!我写的Anto.exe C#代码自动生成工具.欢迎下载。。
  2. c语言实现将字符串首尾*删除,C语言实现Trim()函数:删除字符串首尾空格。...
  3. r720支持多少频率的内存吗_关于内存频率,高频和低频的性能差距大吗?明白这3点很重要...
  4. 依赖注入_set方法注入_构造器注入
  5. IOS的pch文件,NSTimer定时器,运行消息循环,随机色使用
  6. Windows下图文详解PHP三种运行方式(php_mod、cgi、fastcgi)
  7. php去掉查询返回的字段序列,php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回...
  8. 通过哪吒动漫豆瓣影评,带你分析python爬虫与BeautifulSoup快速入门
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的宠物寻回系统
  10. 恭贺武汉大学国际软件学院考生集体通过LPI一级认证
  11. steam linux 安装目录,「Linux」- 安装 Steam 客户端 @20210219
  12. 数据有效性 动态选择
  13. 网络字节序与主机字节序的转换 - HEN_MAN的专栏 - 博客频道 - CSDN.NET
  14. JavaScript 每日一题 #7
  15. 思维导图是一个查漏补缺的好工具
  16. 各厂家linux面板对比
  17. 水星nw315r服务器无响应,水星MW315R作为从路由怎么设置? | 192路由网
  18. 2014年最新810多套源码2.46GB免费一次性打包下载
  19. iOS第三方插件——Masonry详解
  20. -- 40、查询选修“张三“老师所授课程的学生中,成绩最高的学生信息及其成绩

热门文章

  1. Python基础(5) - 文件
  2. Hadoop学习总结:Map-Reduce的过程解析
  3. [ SAP ASAP ] SAP ASAP 方法论 对SAP项目文档的考核标准、 Documentation Principle
  4. [基础题] 5.(*)按如下要求编写Java应用程序:(1)编写一个用于表示战斗能力的接口Fightable,
  5. 用Python实现一个简单的智能换脸软件
  6. [Python图像识别] 四十八.Pytorch构建Faster-RCNN模型实现小麦目标检测
  7. python 之信号Signal
  8. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - A. 组队
  9. 实验6_MPEG音频编码实验
  10. 【嵌入式】C语言高级编程-数组和结构体初始化(02)