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

问题描述 投票:0回答:4

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

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

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

std::replace 进行搜索并替换匹配字节的内容,而我知道要替换哪些字节。而 std::replace 似乎只替换一个元素。我想用大量数据替换。

肯定有一个 std 函数可以“巧妙”地做到这一点吗? (如果我愿意的话,我会叫你雪莉)。

c++ stdvector
4个回答
4
投票

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

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);

3
投票

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


1
投票

简短回答:除非我们从您那里获得更多详细信息,否则您的问题没有最终解决方案

长答案: 从我在这里看到的,在我看来,

std::vector
是一个非常糟糕的选择。
std::vector
在内存中是连续的(从C++03开始),你正在做的事情有两种可能的结果:

  1. 您将保持容器的大小相同,矢量非常适合此
  2. 你将从中间改变向量的大小,而向量在这方面很糟糕!但是,
    std::deque
    是一个中间立场。原因就在这里。它完全支持在(几乎)恒定时间内完成您想做的事情,并提供恒定时间的元素访问。

决定走哪条路时需要回答的问题是:与不会改变向量大小的替换相比,您需要多久进行一次替换?仅当向量大小的数字变化非常小时,std::vector

才是不错的选择。否则,您
应该考虑切换到std::deque

标准中有什么东西可以代替我吗?

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

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

0
投票
它是一个向量,因此您所做的任何可能改变其大小的操作都可能需要分配另一个连续的内存块。我建议不要总是先擦除然后插入,而是根据替换的长度擦除、插入或不执行任何操作。如果替换的内容比原始范围短,则从原始范围中删除多余的内容,如果更长,则插入到原始范围旁边,如果大小相同,则不执行任何操作。之后,您只需将新值复制到新范围即可。不过,如果旧元素不是可轻易破坏的,您应该确保它们被破坏。

© www.soinside.com 2019 - 2024. All rights reserved.