当前协议版本:25.0
我试图立即将 x 元素添加到重复字段中,我认为最好的方法是使用 Resize 函数。但是,当我尝试编译时出现以下错误:
‘class google::protobuf::RepeatedPtrField<Elem>’ has no member named ‘Resize’; did you mean ‘size’?
最小可重现示例(两个函数调用均无法编译):
message Elem{
uint32 a = 1;
}
message Container{
repeated Elem elems = 5;
}
Container c;
c.mutable_elems()->Resize(5);
c.mutable_elems()->Resize(5, Elem());
为什么会出现这种情况?在这种情况下有什么方法可以避免样板吗?
(像
for(int i = 0; i <5; ++i)c.add_elems();
这样的样板)
repeated Elem elems
包含一个类似向量的容器,其中包含指向其他重复消息的指针。 c.mutable_elems()
返回指针 RepeatedPtrField<Elem>
的容器,它没有 Resize()
方法。使用此方法没有什么意义,您不太可能希望用多个空指针填充容器或在多个新元素中重复使用相同的单个指针。
RepeatedPtrField<Elem>
有 Reserve()
方法,可以在插入循环之前使用以获得更好的性能:
Container c;
c.mutable_elems()->Reserve(5);
for (int i = 0; i < 5; ++i)
c.add_elem(...); // or c.AddAllocated(...);