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

Posted

技术标签:

【中文标题】从 Google 协议缓冲区中的重复字符串(列表)中删除一个随机值【英文标题】:Delete a random value from repeated string ( list ) in Google Protocol buffer 【发布时间】: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++ 类就是由此生成的。 How to delete arbitrary objects in repeated field? (protobuf)的可能重复 【参考方案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()开始,然后检查是否应该删除这个迭代器的值。

【讨论】:

以上是关于从 Google 协议缓冲区中的重复字符串(列表)中删除一个随机值的主要内容,如果未能解决你的问题,请参考以下文章

如何在谷歌协议缓冲区中根据需要定义重复字段?

Google Protocol Buffers - 对编码解码 base64 char * c 字符串协议缓冲区数据感到困惑

从字符串中提取数字到列表中[重复]

在 Windows 中使用 MinGW 的 Google 协议缓冲区

C++ 协议缓冲区:常量表达式中的临时非文字类型 'google::protobuf::internal::CallOnInitializedMutex <std::mutex>'

google 的从 c# 到 java 的协议缓冲区 - 协议消息标签的线路类型无效