如何删除重复字段中的任意对象?(protobuf的)

Man*_*d3r 18 c++ protocol-buffers

我在原型的重复字段中有一些条目.现在我要删除其中一些.我怎么能做到这一点?有一个删除最后一个元素的函数,但我想删除任意元素.我不能交换它们,因为订单很重要.

我可以交换下一个直到结束,但是没有更好的解决方案吗?

g19*_*tic 12

根据API文档,没有办法从重复字段中任意删除元素,只是一种删除最后一个元素的方法.

...
我们没有提供删除除last之外的任何元素的方法,因为它会导致低效使用,例如应该是O(n)的O(n ^ 2)过滤循环.如果你想删除除了last之外的元素,最好的方法是重新排列元素,以便你想删除的元素在最后,然后调用RemoveLast()
...


jbl*_*ixr 11

Protobuf v2

你可以DeleteSubrange(int start, int num)RepeatedPtrField课堂上使用.

因此,如果要删除单个元素,则必须将此方法称为DeleteSubrange(index_to_be_del, 1).它将删除该索引处的元素.

Protobuf v3更新

如评论中所述,iterator RepeatedField::erase(const_iterator position)可以删除任意位置

  • @johnbakers当时protobuf v3没有发布,`erase`不在protobuf v2中.在接受的答案中也提到它们没有提供任何方法来擦除v2 (2认同)

小智 8

在这些情况下我通常做的是创建一个新的Protobuf(PB)消息.我迭代现有消息的重复字段,并将它们(除了你不想要的那些)添加到新的PB消息中.