使用基于范围的for语句,比如下面的例子,输出每个字符
#include<iostream>
#include<string>
using namespace std;
int main(void)
{
string s("Hello world!!!");
for (auto c : s)
cout<<c<<endl;
return 0;
}
下面将整个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;
}
由于编译器初始化时会将这些数组形式的元素转换成指向该数组内首元素的指针,这样得到的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;
}
范围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中的迭代器失效了,不再指向任何元素,或者是尾元素的后一个位置。