让我们假设,数据以下面的格式存储在字符缓冲区中
===========================================================================
|length| message1| length| message2| length| message3|...|length |messagen|
===========================================================================
长度 - 表示以下消息的大小
从这个字符缓冲区中,假设只有message2是不需要的,而rest all是相关的, 如何有效地删除message2,以便可以愉快地使用缓冲区中的所有数据?
我已经来到了就地算法,我们可以在没有任何额外副本的情况下在缓冲区中移动消息
但是,由于消息2无关紧要,因此存在转移(n-2)消息的开销
在c ++中有没有更好的方法/解决方案?
让我补充更多详情─ 这里的要求是需要从缓冲区中删除/过滤无关数据,然后将其作为输入传递给另一个函数进行进一步处理
无关数据可以来自字符缓冲区中的任何位置。例如,称为消息2
答案 0 :(得分:1)
你不会说你的长度字段中有多少位,但假设你可以省去额外的一点来使长度值签名而不是无符号,我很想采用一个约定说"如果长度标题有负值,则表示其消息正文无效,应忽略"。
一旦你采用了这个约定,那么将消息2标记为无效就只是用其当前值的否定来覆盖它的长度标题。
当然,稍后读取缓冲区的代码也必须遵循约定,因此,例如如果它看到一个长度标题值为-57那么它应该向前跳过57个字节而不处理它们。