How to delete arbitrary objects in repeated field? (protobuf)
What I usually do in these cases is to create a new Protobuf (PB) message. I iterate the repeated fields of the existing message and add them (except the ones you don't want anymore) to the new PB message.
According to the API docs, there isn't a way to arbitrarily remove an element from within a repeated field, just a way to remove the last one.
...
We don't provide a way to remove any element other than the last because it invites inefficient use, such as O(n^2) filtering loops that should have been O(n). If you want to remove an element other than the last, the best way to do it is to re-arrange the elements so that the one you want removed is at the end, then call RemoveLast()
...
For Protobuf v3
iterator RepeatedField::erase(const_iterator position)
can delete at arbitrary position.
For Protobuf v2
You can use the DeleteSubrange(int start, int num)
in RepeatedPtrField
class.
If you want to delete a single element then you have to call this method as DeleteSubrange(index_to_be_del, 1)
. It will remove the element at that index.