std函数用于替换向量中的字节范围

时间:2017-03-13 11:50:09

标签: c++ stdvector

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

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

我可以使用erase或insert来调整大小,然后将新数据循环到旧数据上。

std :: replace执行搜索并替换匹配的字节,而我知道要替换的字节数。并且std :: replace似乎只替换一个元素。我想用blob数据替换。

当然有一个std功能可以“整齐地”做到这一点? (如果我愿意,我会叫你Shirely。)

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

简短回答:除非我们向您提供更多详细信息,否则您的问题无法找到最终解决方案

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

  1. 你将保持容器的相同大小,矢量非常适合这个
  2. 你会从中间改变矢量的大小,而矢量在这里很可怕!但是,std::deque是这个的中间理由。原因是here。它完全支持在(几乎)恒定时间内完成您想要做的事情,并在恒定时间提供元素访问。
  3. 您需要回答以决定走哪条路的问题:您需要多长时间进行一次替换,以更改向量的大小而不是更改向量的大小?只有当向量大小的数量变化非常小时,std::vector才是一个不错的选择。否则,您应该考虑切换到std::deque

    标准中是否有替代我的东西?

    该标准提供了所有工具,使用您自己编写的功能尽可能高效地完成此操作。擦除(如有必要),然后插入。就这么简单。请记住两件事:

    1. 仅删除差异,不要删除要替换的整个内容,前者会表现更好
    2. 如果要删除的部分的大小等于要放入的数组,请始终考虑特殊情况。在这种情况下,请勿删除或插入任何内容。这样可以大大节省性能。

答案 2 :(得分:1)

如果值完全相同,并且您知道要替换的间隔在向量内,请使用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); 

这将替换从位置3开始的向量v的内容,其内容为replacement

如果您不确定矢量的大小,可以先调整大小:

v.resize(6);