目录
前言
像 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;
}