C++中的多维向量

Nik*_*har 1 c++ arrays vector multidimensional-array

我刚开始学习C++.当我开始变得相当困惑时,我试图掌握多维数组和向量的语法.我得到了如何初始化多维数组.这似乎很简单:行后面是列.然而,向量更具挑战性.我是否必须以相同的方式初始化它们,或者我是否创建了矢量矢量.有人请帮忙.

tin*_*afl 8

声明一个多维向量:

vector<vector<int>> test(4,vector<int>(20));
Run Code Online (Sandbox Code Playgroud)

这创建了一个2D矢量4 X 20.当然,因为它们是可以根据需要改变的矢量.索引与数组相同test[3][19].


R S*_*ahu 6

如果能够使用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)

在多维数组中,保证每一行的列数相同。

给定上述多维数组a1a1[1][2]将是有效元素,并且a1[2][3]将是无效元素。对于矢量的矢量,使用上面的线,a2[1][2]不是有效元素,a2[2][3]而是有效元素。


Sor*_*ush 6

对于感兴趣的读者,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)

在这里阅读更多内容