协议缓冲区 - 存储双数组,1D,2D和3D

osg*_*sgx 21 c++ protocol-buffers multidimensional-array

如何使用协议缓冲区存储双(1D)数组?那么多维(2D或3D)密集阵列呢?

smi*_*hax 26

人们可以简单地模仿C/C++内存布局:

message DoubleMatrix {
  required uint32 rows = 1;
  required uint32 cols = 2;
  repeated double data = 3 [packed=true];
}
Run Code Online (Sandbox Code Playgroud)

要访问数据,请使用data[i*cols+j](row-major)或data[i+rows*j](column-major).对于方形矩阵,只需要存储一个rows/ cols必须存储.从技术上讲,即使在矩形情况下,protobuf也会知道数据的长度,并且可以导出另一个值.

为了便于使用,可能会将Matrix包装在C++中,其中包含允许访问的Adapter类double MatrixAdapter::get(int row, int col); 它也可以验证data_size()==rows()*cols().


Mar*_*ell 25

最好存储一个double数组

repeated double foo = 5 [packed=true];
Run Code Online (Sandbox Code Playgroud)

repeated使它作为一个列表,允许多个项目; packed避免每个项目的标题.

protobuf中没有矩形(或更高)数组的直接支持.最接近的是存储类似的东西:

repeated innerType foo = 5; // note, can't be "packed"

message innerType {
    repeated double foo = 1 [packed=true];
}
Run Code Online (Sandbox Code Playgroud)

这大致类似于锯齿状阵列,但每层之间都有一个元素.

  • @osgx而不是"数组数组",它更像是一个"对象数组,每个对象*都有一个数组" - 更好吗? (5认同)
  • 请将"大致类似于锯齿状阵列"翻译成更多编程英语? (3认同)