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

时间:2016-01-16 07:28:42

标签: c++ protocol-buffers

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

比方说我们有消息定义:

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

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

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

1 个答案:

答案 0 :(得分:0)

以下是一个reason为什么Remove()中没有protocol buffer

  

我不想提供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()开始,然后检查是否应删除此迭代器的值。