声明一个多维向量:
vector<vector<int>> test(4,vector<int>(20));
Run Code Online (Sandbox Code Playgroud)
这创建了一个2D矢量4 X 20.当然,因为它们是可以根据需要改变的矢量.索引与数组相同test[3][19].
如果能够使用C ++ 11,则可以类似的方式初始化向量的多维数组和向量。
int a1[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
Run Code Online (Sandbox Code Playgroud)
但是,在访问元素而不遇到未定义的行为时必须理解一些差异。
对于多维数组,需要连续分配数组元素的内存。对于向量的向量,元素的存储空间很可能是不相交的。
记忆a1:
a1[0][0] a1[1][0] a1[2][0]
| | |
v v v
+---+---+---+---+---+---+---+---+---+
| | | | | | | | | |
+---+---+---+---+---+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)
内存a2(最有可能):
a2[0][0]
|
v
+---+---+---+
| | | |
+---+---+---+
a2[1][0]
|
v
+---+---+---+
| | | |
+---+---+---+
a2[2][0]
|
v
+---+---+---+
| | | |
+---+---+---+
Run Code Online (Sandbox Code Playgroud)
同样,可以定义一个向量的向量,其中每一行的列数都不相同。
std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5}, {6, 7, 8, 9} };
Run Code Online (Sandbox Code Playgroud)
在多维数组中,保证每一行的列数相同。
给定上述多维数组a1,a1[1][2]将是有效元素,并且a1[2][3]将是无效元素。对于矢量的矢量,使用上面的线,a2[1][2]不是有效元素,a2[2][3]而是有效元素。
对于感兴趣的读者,Boost 有一个专门针对这个问题设计的 MultiArray 库。它声称比 C++ STL 更高效,std::vector<std::vector<...>>并且其界面是 C++ STL 友好的。
#include "boost/multi_array.hpp"
int main () {
// Create a 3D array that is 3 x 4 x 2
boost::multi_array<double, 3> A(boost::extents[3][4][2]);
// Assignment
A[0][0][0] = 1.0;
// Dereference
std::cout<<A[0][0][0];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这里阅读更多内容