目錄
vector
deque
array
多維的vector
前言
像 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;
}