关于C++中二维和多维vector, deque, array的表示

目录

前言

像 vector, deque, array 这种类数组的容器, 其存储的思想和C语言中的普通数的组存储思想差不多, 本质上可以看作是指针的多级嵌套. 例如一个三级指针指向一个二级指针, 一个二维指针指向一个一维指针, 一个一维指针指向一个变量.... 下面是一个多级指针嵌套的例子

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    int ***p = nullptr;
    int **o = nullptr;
    int *i = nullptr;
    int variable = 1;

    i = &variable;
    o = &i;
    p = &o;

    cout << ***p << endl;

    system("pause");

    return 0;
}

输出结果:

1

关于多级指针的相关概念可看 : http://c.biancheng.net/view/225.html 理解了多级指针就能理解多维顺序容器和数组了

vector

vector的二维表示 :

二维 vector 可以看作是一个存储元素的类型为 vector 的 vector . 下面是一个二维 vector 的例子

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    vector<vector<int> > vi;

    return 0;
}

二维 vector 的初始化

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    vector<vector<int>> vi
    {
        vector<int>{1, 2, 3, 4, 5},
        vector<int>{6, 7, 8, 9, 10},
        vector<int>{11, 12, 13, 14, 15}
    };

    return 0;
}

这种初始化形式就很像 C语言多维数组的那种初始化了. 这个 vector 中每个元素都为 vector<vector> 类型, 而每个子 vector 中的每个元素都为 int 类型.

二维 vector 的插入

看如下的代码, 如何向一个空的 vector 插入元素

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    vector<vector<int>> vi;
    int Val;

    /*向一维vector中插入元素, 每个元素都为空 vector*/

    vi.push_back(vector<int>{});
    vi.push_back(vector<int>{});
    vi.push_back(vector<int>{});

    /*现在向每个空 vector 插入元素*/

    Val = 1;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            vi[i].push_back(Val);
            Val++;
        }
    }

    /*输出元素*/

    for (auto i : vi)
        for (auto j : i)
            cout << j << ' ';

    cout << endl;

    return 0;
}

输出结果 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

这里要注意的是, 最后的输出, 第一层 for 中的 i 实际是指向 vector<int> 类型的元素, 而第二层才是真正输出 vector<int> 中的元素, 即 int 变量

删除和插入类似, 就不细说了

deque

二维 deque 和 vector 差不多, 甚至可以说类似的顺序容器都差不多

初始化

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    deque<deque<int>> Q
    {
        deque<int>{1, 2, 3, 4, 5},
        deque<int>{6, 7, 8, 9, 10},
        deque<int>{11, 12, 13, 14, 15}
    };

    return 0;
}

插入

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    deque<deque<int>> vi;
    int Val;

    /*向一维deque中插入元素, 每个元素都为空 deque*/

    vi.push_back(deque<int>{});
    vi.push_back(deque<int>{});
    vi.push_back(deque<int>{});

    /*现在向每个空 deque 插入元素*/

    Val = 1;

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            vi[i].push_back(Val);
            Val++;
        }
    }

    /*输出*/

    for (auto i : vi)
        for (auto j : i)
            cout << j << ' ';

    cout << endl;

    return 0;
}

输出 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

array

初始化

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    array<array<int, 2>, 5> A
    {
        array<int, 2>{1, 2},
        array<int, 2>{3, 4},
        array<int, 2>{5, 6},
        array<int, 2>{7, 8},
        array<int, 2>{9, 10}
    };

    return 0;
}

由于 array 的大小不能更改, 所以只能为 array 中的元素赋值

为 二维array 中的每个元素赋值

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    array<array<int, 2>, 5> A;

    int Num = 1;

    for (int i = 0; i < 5; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            A[i][j] = Num;
            Num++;
        }
    }

    for (auto i : A)
        for (auto j : i)
            cout << j << ' ';

    cout << endl;

    return 0;
}

输出

1 2 3 4 5 6 7 8 9 10


多维的 vector

了解了二维的 vector 就可以理解多维的 vector 了, 下面是一个五维的 vector 初始化的例子 ( 是不是看起来像个倒着的玛雅金字塔? )

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    vector<vector<vector<vector<vector<int>>>>> vi
    {
        vector<vector<vector<vector<int>>>>
        {
            vector<vector<vector<int>>>
            {
                vector<vector<int>>
                {
                    vector<int>{1, 2, 3, 4, 5},
                    vector<int>{6, 7, 8, 9, 10},
                    vector<int>{11, 12, 13, 14, 15}

                }
            }

        }
    };

    return 0;
}

五维数组的插入

#include <iostream>
#include <array>
#include <vector>
#include <deque>

using namespace std;

int main(void)
{
    vector<vector<vector<vector<vector<int>>>>> vi;
    int Val = 1;

    vi.push_back(vector<vector<vector<vector<int>>>>{});
    vi[0].push_back(vector<vector<vector<int>>>{});
    vi[0][0].push_back(vector<vector<int>>{});
    vi[0][0][0].push_back(vector<int>{});
    vi[0][0][0].push_back(vector<int>{});
    vi[0][0][0].push_back(vector<int>{});

    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 5; j++)
        {
            vi[0][0][0][i].push_back(Val);
            Val++;
        }
    }

    for (auto A : vi)
        for (auto B : A)
            for (auto C : B)
                for (auto D : C)
                    for (auto E : D)
                        cout << E << ' ';

    cout << endl;

    return 0;
}
上一篇:bilibiliC++38-44_STL常用容器_deque容器


下一篇:【数据结构与算法】滑动窗口