【问题标题】:Delete a random value from repeated string ( list ) in Google Protocol buffer从 Google 协议缓冲区中的重复字符串(列表)中删除一个随机值
【发布时间】:2016-01-16 07:28:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是什么语言?它肯定不是 C++!如果这是 protobuf 从中创建 C++ 代码的某个 IDL,您需要查看该代码以了解如何使用它。关于从容器中删除元素,请使用任何 C++ 教程来熟悉容器。
  • @UlrichEckhardt 这是google protobuf定义。 C++ 类就是由此生成的。

标签: c++ protocol-buffers


【解决方案1】:

这是reason为什么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()开始,然后检查是否应该删除这个迭代器的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2011-05-10
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多