将4D数组存储在Vector中?

时间:2015-10-13 22:02:16

标签: c++ arrays vector

我正在将数据收集到一个4D数组中(这是大多数代码已经实现的方式)并且我随时间记录数据(即将有多个4D数组)。

4D阵列的总大小为8x2x8x150个浮点数,即float data[8][2][8][150]

我希望能够将每个后续传入的4D数组存储到一个向量中,以便以后保存/操作。

我理解,C ++中的数组不能按原样存储在向量中。如何在不确定的时间内(即不是固定的矢量大小)轻松存储此数据?请记住,这是一个相当大的数据集(每个4D阵列约38Kb)

4 个答案:

答案 0 :(得分:2)

您可以创建一个辅助类,将数据存储在std::vector中,但提供4D数组的接口。

struct My4DArray
{
   My4DArray(int d1, int d2, int d3, int d4) :
     d1(d1), d2(d2), d3(d3), d4(d4), data(d1*d2*d3*d4) {}

   float& at(int i1, int i2, int i3, int i4)
   {
       return data[getIndex(i1, i2, i3, i4)];
   }

   int getIndex(int i1, int i2, int i3, int i4)
   {
      assert(i1 >= 0 && i1 < d1);
      assert(i2 >= 0 && i2 < d2);
      assert(i3 >= 0 && i3 < d3);
      assert(i4 >= 0 && i4 < d4);

      // ??? Need to verify the formula.
      return (((i1*d2 + i2)*d3 + i3)*d4 + i4);
   }

   int d1;
   int d2;
   int d3;
   int d4;
   std::vector<float> data;

};

答案 1 :(得分:1)

您可以定义一个别名,用于定义一段时间的ax[i],其中多个维度几乎与C样式数组一样简单:

std::array

然后,由于template<typename Type, std::size_t N, std::size_t... Sizes> struct multi_array { using type = std::array<typename multi_array<Type, Sizes...>::type, N>; }; template<typename Type, std::size_t N> struct multi_array<Type, N> { using type = std::array<Type, N>; }; template<typename Type, std::size_t... Sizes> using multi_array_t = typename multi_array<Type, Sizes...>::type; 可以存储在std::array中,只需使用生成的数组:

std::vector

Live demo

答案 2 :(得分:0)

有趣的问题。我想你可能会对Pramod Gupta今年的cppcon C++ Multi-dimensional Arrays谈话感兴趣。

基本上,使用他的orca_array库(仅限标题,MIT许可证),您应该可以执行以下操作:

#inclue <vector>
#include "orca_array.hpp"

std::vector<orca_array::array4d<double>> my_vector_of_4d_arrays;

答案 3 :(得分:-2)

您可以将其存储为19200个元素的一维数组,以

形式访问
array[i*2400 + j*1200 + k*150 + l] // array[i,j,k,l]