文章目录
3.6 多维数组
C++中多维数组的几个特征
- C++中多维数组的本质是数组的数组,这与其他很多语言没有什么区别。
- 在初始化时可以按数组的数组的形式进行赋值:
int ia[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
- 除了第2条这种方式外,C++还会自动根据位数进行填充,也就是可以写成这样:
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11};
- 一个小tips,在使用范围for循环时,除了最内层的循环外,所有外层的循环变量都应该使用引用类型,这样可以减小很多的构造开销。
- 可以使用类型别名来简化数组的显示,以下是两种类型的声明:
typedef int int_array[4];//老式风格的别名定义
using int_array = int[4];//新风格的别名定义
习题
3.43 使用三种方式输出多维数组ia的值,第一种使用范围for循环,第二种使用普通的for循环并且使用下标取值,第三种也使用普通的for循环但要使用指针。要求不使用自动类型推断比如auto、decltype等。
没有什么特别的点,直接帖结果
#include <stdio.h>
#include <iostream>
using namespace std;
int ia[3][4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
void OutputWithFor()
{
cout << "output with for" << endl;
for(size_t i = 0;i < 3;i++ )
{
for(size_t j = 0;j<4;j++)
{
cout << ia[i][j] << "\t";
}
cout << endl;
}
}
void OutputWithForRange()
{
cout << "output with for range" << endl;
for(int (&innerArray)[4] : ia)
{
for(int &value : innerArray)
{
cout << value << "\t";
}
cout << endl;
}
}
void OutputWithPoint()
{
cout << "output with point" << endl;
for(int (*innerArray)[4] = begin(ia); innerArray != end(ia);innerArray++)
{
for(int *value = begin(*innerArray); value != end(*innerArray);value ++ )
{
cout << *value << "\t";
}
cout << endl;
}
}
int main()
{
OutputWithFor();
OutputWithForRange();
OutputWithPoint();
}
3.44 改写上面的程序,使用类型别名替换循环变量控制的类型。
考察类型别名的使用,也没有什么特别的
#include <stdio.h>
#include <iostream>
using namespace std;
// typedef int int_array[4];
using int_array = int[4];
int_array ia[3] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
void OutputWithFor()
{
cout << "output with for" << endl;
for(size_t i = 0;i < 3;i++ )
{
for(size_t j = 0;j<4;j++)
{
cout << ia[i][j] << "\t";
}
cout << endl;
}
}
void OutputWithForRange()
{
cout << "output with for range" << endl;
for(int_array &innerArray : ia)
{
for(int &value : innerArray)
{
cout << value << "\t";
}
cout << endl;
}
}
void OutputWithPoint()
{
cout << "output with point" << endl;
for(int_array *innerArray = begin(ia); innerArray != end(ia);innerArray++)
{
for(int *value = begin(*innerArray); value != end(*innerArray);value ++ )
{
cout << *value << "\t";
}
cout << endl;
}
}
int main()
{
OutputWithFor();
OutputWithForRange();
OutputWithPoint();
}
3.45 再次改写程序,要求使用auto关键字
直接替换类型就好了
#include <stdio.h>
#include <iostream>
using namespace std;
typedef int int_array[4];
int_array ia[3] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
void OutputWithFor()
{
cout << "output with for" << endl;
for(auto i = 0;i < 3;i++ )
{
for(auto j = 0;j<4;j++)
{
cout << ia[i][j] << "\t";
}
cout << endl;
}
}
void OutputWithForRange()
{
cout << "output with for range" << endl;
for(auto &innerArray : ia)
{
for(auto &value : innerArray)
{
cout << value << "\t";
}
cout << endl;
}
}
void OutputWithPoint()
{
cout << "output with point" << endl;
for(auto *innerArray = begin(ia); innerArray != end(ia);innerArray++)
{
for(auto *value = begin(*innerArray); value != end(*innerArray);value ++ )
{
cout << *value << "\t";
}
cout << endl;
}
}
int main()
{
OutputWithFor();
OutputWithForRange();
OutputWithPoint();
}
一点想法记录
从一开始决定啃C++Pirmer到现在已经过去大半年,原计划今年完成这本书的学习,结果突然工作量爆炸,又跟人合作开发一个小游戏,似乎今年的目标无法达成了,也是很令人蛋疼。
离过年还有两个月,这两个月之内尽可能地完成小游戏的工作,然后继续进行学习吧。