C++ Primer第三章⑥

C++ Primer

第三章 字符串,向量和数组

***数组

其实C++语言中没有***数组,***数组其实就是数组的数组。 当一个数组的元素仍然是数组时,通常使用两个维度来定义它:一个维度表示数组本身大小,另外一个表示其元素(也是数组)大小,其实可以理解为一个表格:

int a[3][4]; //大小为3的数组,每个元素是含有4个整数的数组
int arr[10][20][30] = {0};
//大小为10的数组,它的每个元素都是大小为20的数组
//这些数组的元素是含有30个整数的数组
//所有元素初始化为0
***数组的初始化
int a[3][4] = { {0,1,2,3}, {4,5,6,7}, {8,9,10,11} }; //这样看很好理解吧三行四列
int b[3][4] = {0, 1, 2, 3, 4, 5,6, 7, 8, 9, 10, 11}; //等价于a
int c[3][4] = { {0}, {4}, {8} }; //显式地初始化每行的首元素,其他默认初始化为0
int d[3][4] = {0, 3, 6, 9}; //显式初始化第一行,其他元素执行默认初始化
***数组的下标引用
a[2][3] = arr[0][0][0]; //用arr的首元素为a的最后一行最后一个元素赋值
//数组a[3][4]的最后一个元素是a[2][3]哦
int (&row)[4] = a[1]; //把row绑定到a的第2行上

再举一个例子,程序中经常会用到两层嵌套的for循环来处理***数组的元素

contexpr size_t row = 3, col = 4;
int a[row][col];  //12个默认初始化的元素,都是0
for( size_t i=0; i<row; ++i)
{
    for(size_t j=0; j<col; ++j)
    {
        a[i][j] = 1; //都赋值为1
    }
}

也可以用auto来写,效果是一样的,随你高兴

for(auto &row : a)
{
    for(auto &col : row)
    {
        col = 1;
    }
}

在上面的例子中,因为要改变元素的值,所以我们选择引用类型作为循环控制变量,其实呢,还有一个更深层次的原因,来,慢慢看 比如我们不打算修改a的元素值,只是输出它们,也得要引用,假设没有引用,我们来看一下

for(auto row : a)
{
    for(auto col : row)
    {
        cout << col << endl;
    }
}

如果你觉得这样就可以的话,就太年轻了,这样编译是会出错的,因为row没有用引用,所以编译器对于数组名字的解释就变成了该数组首元素的指针,这样得到的row类型就是int,显然,内层col的循环就不合法了,编译器试图在一个int 内遍历,肯定错了。

要使用auto的for循环,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。

==因为有了新东西***数组,指针又要来了。。。==

指针和***数组

当程序使用***数组的名字时,也会自动将其转换成指向数组首元素的指针,不要忘了***数组实际上是数组的数组,所以啊***数组名转换来的指针实际上是指向第一个内层数组的指针:

int a[3][4];
int (*p)[4] = a; //p指向a的首行,即含有4个整数的数组,圆括号必不可少的哦
p = &a[2]; //p指向a的尾元素

遍历输出的不同写法:

int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
for( auto p = a; p != a+3; ++p ) //p指向含有四个整数的数组
{
    for( auto q = *p; q != *p+4; ++q)
    {
        cout << *q << endl;
    }
}

或者:

for( auto p = begin(a); p != end(a); ++p ) //p指向含有四个整数的数组
{
    for( auto q = begin(*p); q != end(*p); ++q)
    {
        cout << *q << endl;
    }
}

使用auto关键字能让我们不用关心***数组的元素类型是啥。

类型别名简化***数组的指针

这个我反正不怎么用,不过还是有点用处的,看着简洁点:

using int_array = int[4]; //将4个整数组成的数组命名为int_array
for(int_array *p = a; p != a+3; ++p)
{
    for(int *q = *p; q != a+4; ++q)
    {
        cout << *q << endl;
    }
}
#C++工程师#
全部评论

相关推荐

仁者伍敌:难怪小公司那么挑剔,让你们这些大佬把位置拿了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务