1. 程式人生 > 其它 >二維、三維陣列初始化及遍歷

二維、三維陣列初始化及遍歷

技術標籤:c/c++c++

二維陣列初始化及遍歷:

        int arr2[3][4] = {
            {43,35,61,72},
            {65,33,55,22},
            {23,56,33,77}
            };

        //方法1
        cout << "Method 1:\n";
        for(int i = 0; i < 3; i++)
        {
            for(int j = 0; j < 4; j++)
            {
                cout << arr2[i][j] << " ";
            }
            cout << "\n";
        }

        //指標和多維陣列
        //方法2
        cout << "Method 2:\n";
        //i指向含有4個整數的陣列,類似i = &arr2[];那麼*i則表示一個一維陣列
        for(int (*i)[4] = arr2; i<arr2+3; i++)
        {
            //此時*i表示一個一維陣列,我們知道一維陣列的陣列名就是該陣列的首地址,那麼(*i)就指向該一維陣列首地址
            for(int *j = *i; j<*i+4; j++)
            {
                cout << *j << " ";
            }
            cout << "\n";
        }

        //方法3
        //在方法2基礎上使用c++11的auto關鍵字
        cout << "Method 3:\n";
        for(auto i = arr2; i < arr2 + 3; i++)
        {
            for(auto j = *i; j < *i+4; j++)
            {
                cout << *j << " ";
            }
            cout << "\n";
        }

        //方法4
        //使用標準庫的begin()、end()函式
        cout << "Method 4:\n";
        for(int (*i)[4] = begin(arr2); i != end(arr2); i++)
        {
            for(int *j = begin(*i); j != end(*i); j++)
            {
                cout << *j << " ";
            }
            cout << "\n";
        }

        //方法5
        //在方法4的基礎上使用auto關鍵字
        cout << "Method 5:\n";
        for(auto i = begin(arr2); i != end(arr2); i++)
        {
            for(auto j =  begin(*i); j != end(*i); j++)
            {
                cout << *j << " ";
            }
            cout << "\n";
        }

        //多維陣列下標引用
        //方法6      
        //除了最內層可以不用引用外,其它都需要用引用。如果需要修改資料,則最內層也需要用引用
        cout << "Method 6:\n";
        for(auto &x:arr2) //若寫成for(auto x : arr2),則x表示int*,這樣內層迴圈遍歷一個指標顯然不合法
        {
            for(auto &y:x)
            {
                printf("%d ", y);
            }
            printf("\n");
        }

執行結果:

三維陣列:

3維陣列可以理解為是由多個2維陣列構成:

        //可以理解arr[2][3][4]為由2個tmp[3][4]二維陣列構成
        int arr[2][3][4] = {
            {
                {43,35,64,75},{65,33,55,22},{23,56,33,77}
            },
            {
                {22,44,56,24},{24,87,46,34},{34,36,73,58}
            }
        };

        //遍歷3維陣列的方法和上面遍歷二維陣列的方法一樣,下面舉例2種具有代表性的方法,其它方法的大家可自行練習
        //舉兩種初始化方法
        //方法1
        cout << "Method 1:\n";
        for(int (*x)[3][4] = arr; x!=arr+2; x++)
        {
            for(int (*y)[4] = *x; y!=*x+3; y++)
            {
                for(int *z = *y; z!=*y+4;z++)
                {
                    printf("%d ", *z);
                }
                printf("| ");
            }
            printf("\n");
        }

        //方法2
        cout << "Method 2:\n";
        for(auto &x:arr)
        {
            for(auto &y:x)
            {
                for(auto &z: y)
                {

                    printf("%d ", z);
                }
                printf("| ");
            }
            printf("\n");
        }

執行結果:

參考:c++ primer5