STD功能替换向量中的字节范围

std functions to replace range of bytes in vector

本文关键字:字节 范围 向量 功能 替换 STD      更新时间:2023-10-16

我有一个字节向量(std :: vector):[1,1,1,1,9,9,9,1,1,1]

我想用未知的字节长度替换字节3-6(我会在运行时知道。)。因此,矢量的长度可能会生长,推迟或保持不变。但是我知道要替换的字节的起点和终点。

我可以使用擦除或插入来调整大小,然后在旧数据上循环循环。

std ::替换进行搜索和匹配字节匹配的替换,而我知道要替换的字节。和std ::替换似乎只替换一个元素。我想替换为数据斑点。

肯定有一个性病功能可以"整洁"吗?(如果我愿意,我会打电话给您)。

如果值全部相同,并且您知道要替换的间隔在向量内,请使用std::fill

std::fill(v.begin() + 3, v.begin() + 6, 9);

此行将用值9替换向量v上的元素3-6。

如果要放置的值并非全部相同,请改用std::copy(您需要确保替换适合向量中):

std::copy(replacement.begin(), replacement.end(), v.begin() + 3); 

这将用replacement的内容从位置3开始替代向量v的内容。

如果您不确定向量的大小,则可以先纠正大小:

v.resize(6);

std::vector::insert可以插入范围,因此只需删除现有元素并插入新元素即可。

简短答案:除非我们从您那里获得更多详细信息

长答案:从我在这里看到的东西,对我来说,std::vector是一个非常糟糕的选择。std::vector在内存中是连续的(从C 03开始),您所做的事情有两个可能的结果:

  1. 您将保持相同的容器大小,并且向量非常适合此
  2. 您会从中间更改向量的大小,而向量的矢量很可怕!但是,std::deque是为此的中间立场。原因在这里。它准确地支持在(几乎)恒定时间(几乎)恒定时间内进行您想做的事情,并在恒定时间提供元素访问。

您需要回答的问题以确定要走的方法是:您需要多久进行一次替换,而替换将改变向量的大小,而不是一个矢量的大小?只有当数字变化的矢量大小很小时,std::vector才是一个不错的选择。否则,您应该考虑切换到std::deque

标准中有什么可以替代我的?

标准提供了所有工具,可以通过您自己写的功能尽可能高效地做到这一点。擦除(如有必要),然后插入。就这么简单。请记住两件事:

  1. 只删除差异,不要删除您要替换的整个东西,前者会表现更好
  2. 如果要删除的零件的大小等于您要放入的数组,请始终考虑特殊情况。在这种情况下,不要删除或插入任何内容。这节省了大量的性能。