C++基础---多维数组

来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/05/17 22:53

1. 多维数组

1.1 二维数组

  • 二维数组:本质上是以数组作为数组元素的数组,即“数组的数组”

1.2 二维数组的初始化

  • 方式一:将所有的元素都放在括号内依次排开
    int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ;(这样写不直观)
    把{ }中的数据依次赋给a数组各元素(按行赋值),即:
    a[0][0]=1;  a[0][1]=2; a[0][2]=3; a[0][3]=4;
    a[1][0]=5;a[1][1]=6; a[1][2]=7; a[1][3]=8;
    a[2][0]=9;a[2][1]=10;a[2][2]=11;a[2][3]=12;
  • 方式二:根据二维数组的下标分为x行y列,每行用括号括起来
    int a[3][4]={{1,2,3,4},
          {5,6,7,8,9},
          {10,11,12}} ;(这样写更清晰,更容易维护)

    在{ }内部再用{ }把各行分开,第一对{ }中的初值1,2,3,4是第0行的4个元素的初值。第二对{ }中的初值5,6,7,8是第1行的4个元素的初值。第三对{ }中的初值9,10,11,12是第2行的4个元素的初值。即:
    a[0][0]=1;  a[0][1]=2; a[0][2]=3; a[0][3]=4;
    a[1][0]=5;a[1][1]=6; a[1][2]=7; a[1][3]=8;
    a[2][0]=9;a[2][1]=10;a[2][2]=11;a[2][3]=12;
    注:初始化的数据个数不能超过数组设置的下标界限,否则导致越界出错。
  • 方式三:为部分数组元素初始化
    int a[2][3]={{1,2},{4}};
    <=>等价于
    int a[2][3]={{1,2,0},{4,0,0}};
    第一行只有2个初值,按顺序分别赋给a[0][0]和a[0][1];第二行的初值4赋给a[1][0],其它数组元素的初值为0。即:
    a[0][0]=1;  a[0][1]=2; a[0][2]=0;
    a[1][0]=4;a[1][1]=0; a[1][2]=0;
  • 方式四:可以省略第一维的定义,但不能省略第二维的定义。系统根据初始化的数据个数和第2维的长度可以确定第一维的长度
    int a[ ][3]={ 1, 2, 3, 4};
    <=>等价于
    int a[ ][3]={{1,2,3},{4}};
    <=>等价于
    int a[ ][3]={{1,2,3},{4,0,0}};
    <=>等价于
    int a[2][3]={{1,2,3},{4,0,0}};
    a数组的第一维的定义被省略,初始化数据共4个,第二维的长度为3,即每行3个数,所以a数组的第一维是2。
    一般,省略第一维的定义时,第一维的大小按如下规则确定:
    初值个数能被第二维整除,所得的商就是第一维的大小;若不能整除,则第一维的大小为商再加1。即:
    a[0][0]=1;  a[0][1]=2; a[0][2]=3;
    a[1][0]=4;a[1][1]=0; a[1][2]=0;
    注:在{ }中给出各数组元素的初值,各初值之间用逗号分开。把{ }中的初值依次赋给各数组元素。

1.3 二维数组的元素在内存中的排放顺序

  • 如:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  • 二维数组在内存中的分布列表:

    值 1 2 3 4 5 6 7 8 9 10 11 12 数组下标 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]

    注:数组元素就像排列好队的士兵,他们在内存中也都是按照编号顺序排放的。

  • 二维数组的元素在内存中的排放顺序的程序示例:

    #include <iostream>using namespace std;int main(){    int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};    for (int i=0; i<3; i++)    {        for (int j=0; j<4; j++)        {            cout<<"a["<<i<<"]["<<j<<"] = "<<a[i][j]<<endl;        }    }    system("pause");    return 0;}=>a[0][0] = 1  a[0][1] = 2  a[0][2] = 3  a[0][3] = 4       a[1][0] = 5  a[1][1] = 6  a[1][2] = 7  a[1][3] = 8     a[2][0] = 9  a[2][1] = 10  a[2][2] = 11  a[2][3] = 12  

1.4 多维数组

  • 二维数组:可视为以一维数组为数据元素的向量;
  • 二维数组:每个元素都属于两个向量;
  • 三维数组:可视为以二维数组为数据元素的向量;
  • 三维数组:每个元素都属于三个向量;
  • 四维数组:可视为以三维数组为数据元素的向量;
  • 四维数组:每个元素都属于四个向量;
  • n维数组: 可视为以(n-1)维数组为数据元素的向量;
  • n维数组: 每个元素都属于n个向量;

1.5 多维数组的顺序存储方式

  • 由于计算机内存是一维的,多维数组的元素应排成线性序列后存人存储器。
    数组一般不做插入和删除操作,即结构中元素个数和元素间关系不变化。
  • 一般采用顺序存储方法表示数组。
    (1)行优先顺序:将数组元素按行向量排列,第i+1个行向量紧接在第i个行向量后面。
    如:二维数组Amn的按行优先存储的线性序列为:
    a00,a01,…,a0(n-1),
    a10,a11,…,a1(n-1),
    ……,
    a(m-1)0,a(m-1)1,…,a(m-1)(n-1)
    注:PASCAL和C语言中,数组按行优先顺序存储。
    行优先顺序推广到多维数组,可规定为先排最右的下标。

    (2)列优先顺序:将数组元素按列向量排列,第i+1个列向量紧接在第i个列向量后面。C语言中没有列优先顺序。
    如:二维数组Amn的按列优先存储的线性序列为:
    a00,a10,…,a(m-1)0,
    a01,a11,…,a(m-1)1,
    ……,
    a0(n-1),a1(n-1),…,a(m-1)(n-1)
    注:FORTRAN语言中,数组按列优先顺序存储。
    列优先顺序推广到多维数组,可规定为先排最左的下标。

1.6 遍历多维数组的10种方式

  • 方法一:下标

    int a[3][4] = {1,2,3,4,5,6,7,8};for (int i = 0; i < 3; i++){    for (int j = 0; j < 4; j++)    {        cout << a[i][j] << endl;    }}
  • 方法二:指针

    int a[3][4] = {1,2,3,4,5,6,7,8};for (int(*p)[4] = a; p != a + 3; p++){    for (int *q = *p; q != *p + 4; q++)    {        cout << *q << endl;    }}  
  • 方法三:指针,迭代

    int a[3][4] = {1,2,3,4,5,6,7,8};for (int(*p)[4] = begin(a); p != end(a); p++){    for (int* q = begin(*p); q != end(*p); q++)    {        cout << *q << endl;    }}
  • 方法四:范围for

    int a[3][4] = {1,2,3,4,5,6,7,8};for (int (&p)[4] : a){    for (int q : p)    {        cout << q << endl;    }}
  • 方法五:类别名+指针

    int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array* p = a; p != a + 3; p++){    for (int* q = *p; q != *p + 4; q++)    {        cout << *q << endl;    }}
  • 方法六:类别名+迭代

    int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array *p = begin(a); p != end(a); p++){    for (int* q = begin(*p); q != end(*p); q++)    {        cout << *q << endl;    }}
  • 方法七:类别名+范围for

    int a[3][4] = {1,2,3,4,5,6,7,8};typedef int int_array[4];for (int_array &p : a){    for (int q : p)    {        cout << q << endl;    }}
  • 方法八:auto

    int a[3][4] = {1,2,3,4,5,6,7,8};for (auto p = a; p != a + 3; p++){    for (auto q = *p; q != *p + 4; q++)    {        cout << *q << endl;    }}
  • 方法九:auto+迭代

    int a[3][4] = {1,2,3,4,5,6,7,8};for (auto p = begin(a); p != end(a); p++){    for (auto q = begin(*p); q != end(*p); q++)    {        cout << *q << endl;    }}
  • 方法十:auto+范围for

    int a[3][4] = {1,2,3,4,5,6,7,8};for (auto &p : a){    for (auto q : p)    {        cout << q << endl;    }}

参考文献:
[1]《C++全方位学习》范磊——第十四章
[2]《C++程序设计教程(第二版)》钱能——第三章
[3]《C++Primer(中文版)》王刚、杨巨峰——第三章
[4] 百度搜索关键字:C++数组、二维数组、二维数组的初始化、数组元素在内存中的分布、多维数组

0 0
原创粉丝点击