从谷歌协议缓冲区中的重复字符串(列表)中删除随机值
Delete a random value from repeated string ( list ) in Google Protocol buffer
我想从重复字段中删除项目
假设我们有一个消息定义:
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()
开始,然后检查是否应该删除这个迭代器的值。
相关文章:
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 从类型列表中递归删除重复项会导致编译器堆空间错误 (VS2017)
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 删除列表 c++ 中的最后 3 个元素
- 为什么每当我尝试运行此链接列表删除功能时都会收到分段错误错误?
- 我可以从列表中获取对象并复制它们,但如何删除我复制的对象?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素
- C++ 从具有开始位置和结束位置的列表中删除
- 从列表向量中删除无法按预期工作
- 从列表C++中删除对象
- 简单的链接列表删除失败
- C++循环链接列表 - 删除所有节点
- 链接列表删除节点C
- 链接列表删除
- 矢量与来自 STL 的列表 - 删除方法
- 运算符== 和列表::删除()