本文来自于《C++ Primer》的练习3.43-3.45,觉得多维数组的遍历有不同的实现方式,于是记录一下。写的可能没有按题目的顺序来。题目大概含义是定义了一个二维数组的元素,要求按照行列打印出来(用不同的方式)。
初始代码:
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
\*
write your code
*\
}
输出结果
1. 使用范围for循环
这里使用auto关键字
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (auto &p : a)
{
for (auto &q : p)
cout << q << ' ';
cout << endl;
}
}
p和q的类型是什么?
auto &p
↔ \leftrightarrow ↔int (&p)[4]
,代表一个引用,引用对象是整型的长度为4的数组
auto &q
↔ \leftrightarrow ↔int (&q)
,代表一个引用,引用对象是整型
上面的代换可以直接代入代码中。
2. 使用普通for循环
2.1 使用指针
使用指针有两种方式:
一种方式是直接进行指针操作:
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (auto p = a; p != a + 3; ++p)
{
for (auto q = *p; q != *p + 4; ++q)
cout << *q << ' ';
cout << endl;
}
}
另一种方式是使用标准库函数begin
和end
得到数组的头元素指针和尾后元素指针(数组最后一个元素后一个位置的指针):
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (auto p = begin(a); p != end(a); ++p)
{
for (auto q = begin(*p); q != end(*p); ++q)
cout << *q << ' ';
cout << endl;
}
}
p和q的类型是什么?
auto p
↔ \leftrightarrow ↔int (*p)[4]
,代表一个指针,指向的对象是整型的长度为4的数组
auto q
↔ \leftrightarrow ↔int (*q)
,代表一个指针,指向的对象是整型
2.2 使用数组下标
#include <iostream>
#include <iterator>
using namespace std;
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (size_t i = 0; i != 3; ++i)
{
for (size_t j = 0; j != 4; ++j)
cout << a[i][j] << ' ';
cout << endl;
}
}
上面的p对应的类型是int[4](长度是4的整型数组),我们可以使用类型别名简化。
类型别名的简化
这里以指针为例,引用也是一样的
第一种写法用的是using
关键字
#include <iostream>
#include <iterator>
using namespace std;
using int_array = int[4];
// typedef int int_array[4];
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (int_array *p = a; p != a + 3; ++p)
{
for (int *q = *p; q != *p + 4; ++q)
cout << *q << ' ';
cout << endl;
}
}
另一种写法是使用typedef
关键字
#include <iostream>
#include <iterator>
using namespace std;
typedef int int_array[4];
int main()
{
int a[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
for (int_array *p = a; p != a + 3; ++p)
{
for (int *q = *p; q != *p + 4; ++q)
cout << *q << ' ';
cout << endl;
}
}
参考
- 《C++ Primer》112-116