C ++中的多维向量

时间:2016-12-26 00:13:23

标签: c++ arrays multidimensional-array vector

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

3 个答案:

答案 0 :(得分:7)

声明一个多维向量:

unittest

这会创建一个2D矢量4 X 20.当然,因为它们可以根据需要更改矢量。索引与数组vector<vector<int> > test(4,vector<int>(20)); 相同。

答案 1 :(得分:4)

如果你能够使用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} };

但是,在不遇到未定义的行为的情况下,必须理解访问元素的差异。

对于多维数组,需要连续分配数组元素的内存。对于向量的向量,元素的内存很可能是不相交的。

a1的内存:

a1[0][0]    a1[1][0]    a1[2][0]
|           |           |
v           v           v
+---+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+---+

a2的内存(最有可能):

a2[0][0]
|
v
+---+---+---+
|   |   |   |
+---+---+---+

a2[1][0]
|
v
+---+---+---+
|   |   |   |
+---+---+---+

a2[2][0]
|
v
+---+---+---+
|   |   |   |
+---+---+---+

此外,可以定义一个向量向量,其中每列的列数不相同。

std::vector<std::vector<int>> a2 = { {1, 2, 3}, {4, 5}, {6, 7, 8, 9} };

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

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

答案 2 :(得分:1)

对于感兴趣的读者,Boost具有专门针对此问题设计的MultiArray库。它声称比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;
}

了解更多here