我有一个proto类A,A中有google::protobuf::RepeatedPtrField变量B,B有id,如何根据id删除对应的B,用C++实现
时间: 2024-03-13 10:45:56 浏览: 116
C++实现B树的创建,节点添加和删除。
可以使用erase-remove idiom来实现根据id删除对应的B。不同于使用vector,google::protobuf::RepeatedPtrField是一个类似于指针数组的容器,因此需要使用指针来进行遍历和删除。具体步骤如下:
1. 遍历RepeatedPtrField,将所有id匹配的B从数组中移动到末尾;
2. 再使用RepeatedPtrField的DeleteSubrange函数删除从新数组结尾到原数组结尾的所有元素。
以下是代码示例:
```c++
// 定义A类
class A {
public:
google::protobuf::RepeatedPtrField<B> b_array;
// 其他变量和函数
};
// 定义函数,根据id删除对应的B
void delete_B_by_id(A& a, int id) {
auto new_end = std::remove_if(a.b_array.begin(), a.b_array.end(),
[id](const B* b) { return b->id() == id; });
a.b_array.DeleteSubrange(new_end - a.b_array.begin(), a.b_array.end() - a.b_array.begin());
}
```
使用时,调用delete_B_by_id函数,并传入A对象和要删除的B的id。该函数会自动删除所有id匹配的B。注意,删除后需要手动调用Clear()函数来释放内存,如下所示:
```c++
delete_B_by_id(a, id);
a.mutable_b_array()->Clear();
```
阅读全文