从 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>'