在使用(非对象)C++;不重新创建整个flatbuffers的API 是否可以在不重新创建整个平面缓冲区的情况下使用C++(非对象)API来改变表的数组?

在使用(非对象)C++;不重新创建整个flatbuffers的API 是否可以在不重新创建整个平面缓冲区的情况下使用C++(非对象)API来改变表的数组?,c++,flatbuffers,C++,Flatbuffers,下面是我的模式的一个例子 table Document { root_layer:Layer; bitmaps:[Bitmap]; subdocuments:[Document]; } table Layer { id:int; sublayers:[Layer]; } ... 这里有趣的部分是文档→ 根层→ 子层 假设我想修改整个子层数组:完全重写它,而不仅仅是替换索引处的元素。就我所见,可变性API只允许替换索引处的元素,而不允许用新数组替换整个数组,对吗 今天,我

下面是我的模式的一个例子

table Document {
  root_layer:Layer;
  bitmaps:[Bitmap];
  subdocuments:[Document];
}

table Layer {
  id:int;
  sublayers:[Layer];
}

...
这里有趣的部分是
文档→ 根层→ 子层

假设我想修改整个子层数组:完全重写它,而不仅仅是替换索引处的元素。就我所见,可变性API只允许替换索引处的元素,而不允许用新数组替换整个数组,对吗

今天,我重新创建了整个文档,复制了原始文档中的所有字段,一旦到达嵌套的
子层
,我就用新数组替换它

有更好的方法吗?

没有,没有

使用反射API,可以将新表附加到现有缓冲区,然后调整向量(如
子层
)的大小,并使元素指向新(或旧)表。但目前没有办法删除旧表,而且API使用起来非常痛苦,而且调整大小的速度也很慢(复杂平面结构的就地变异很难)

或者,您可以从头开始创建一个新的缓冲区,如果您想省去为未修改的部分编写手动复制代码的麻烦,您可以再次使用反射API(
CopyTable
)或对象API来复制其余部分

如果您发现您经常想要更改缓冲区的一部分,而不是其他部分,可能。。它们应该在两个不同的缓冲区中

如果出于某种原因,静态数据必须与动态数据放在同一个缓冲区中,一种方法是将静态数据放入
嵌套的\u flatbuffer
,这样您就可以使用单个
memcpy
将其传输到新的缓冲区


恐怕平均而言,使用对象API是最好的选择。

您能否分享用于从快速读取的flatbuffers中更新矢量元素的代码。。。扁平缓冲器。改变一个元素很容易;更改元素数组的长度是不可能的。