从谷歌协议缓冲区中的重复字符串(列表)中删除随机值

Delete a random value from repeated string ( list ) in Google Protocol buffer

本文关键字:列表 删除 随机 字符串 协议 谷歌 缓冲区      更新时间:2023-10-16

我想从重复字段中删除项目

假设我们有一个消息定义:

message foo {
repeated string temp1 ; 
repeated string temp2 ; 
}

我想以某个随机索引从 temp1 中删除项目;

据我所知,我可以通过交换最后一个元素并使用 RemoveLast 来删除;但我不知道如何使用它。对 c++ 中的代码快照有任何帮助吗?

这是protocol buffer中没有Remove()的原因之一。

我不想提供Remove(int),因为它会O(n). 协议缓冲区的版本 1 有这样的功能,我们经常看到人们编写如下循环:

 for (int i = 0; i < field.size(); i++) {
  if (ShouldFilter(field[i])) {
    field.Remove(i);
    --i;
  }
}

这个循环是O(n^2)的,这很糟糕,但很难说它是O(n^2)。 仅提供RemoveLast()背后的想法是迫使您做一些聪明的事情(例如,如文档建议的那样,首先将元素与最后一个元素交换),或者编写自己的循环,从而使代码的时间复杂度显而易见。

这里有两个选项:

  • 将项目从列表末尾复制到要删除的项目以前占用的空间中,然后调用 RemoveLast()

  • 通过使用iterator erase(const_iterator position),但你应该从begin()开始,然后检查是否应该删除这个迭代器的值。