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

时间:2011-07-26 04:17:47

标签: c++ multidimensional-array protocol-buffers

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

2 个答案:

答案 0 :(得分:25)

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

message DoubleMatrix {
  required uint32 rows = 1;
  required uint32 cols = 2;
  repeated double data = 3 [packed=true];
}

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

为了便于使用,可能会使用适配器类将Matrix包装在C ++中,该类允许通过double MatrixAdapter::get(int row, int col)进行访问;它还可以验证data_size()==rows()*cols()

答案 1 :(得分:23)

最好通过

存储一个double数组
repeated double foo = 5 [packed=true];

repeated使其成为一个列表,允许多个项目; packed避免了每个项目的标头。

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

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

message innerType {
    repeated double foo = 1 [packed=true];
}

这大致类似于锯齿状数组,但每层之间都有一个元素。