我有一个字节向量(std::vector): [1,1,1,9,9,9,1,1,1]
我想用未知长度的字节替换字节 3-6(我会在运行时知道)。 因此向量的长度可能会增长、缩短或保持不变。 但我知道我想要替换的字节的起点和终点。
我可以使用擦除或插入来调整大小,然后将新数据循环到旧数据上。
std::replace 进行搜索并替换匹配字节的内容,而我知道要替换哪些字节。而 std::replace 似乎只替换一个元素。我想用大量数据替换。
肯定有一个 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);
这将从位置 3 开始的向量
v
的内容替换为 replacement
的内容。
如果你不确定向量的大小,可以先修正大小:
v.resize(6);
简短回答:除非我们从您那里获得更多详细信息,否则您的问题没有最终解决方案
长答案: 从我在这里看到的,在我看来,
std::vector
是一个非常糟糕的选择。 std::vector
在内存中是连续的(从C++03开始),你正在做的事情有两种可能的结果:
std::deque
是一个中间立场。原因就在这里。它完全支持在(几乎)恒定时间内完成您想做的事情,并提供恒定时间的元素访问。决定走哪条路时需要回答的问题是:与不会改变向量大小的替换相比,您需要多久进行一次替换?仅当向量大小的数字变化非常小时,std::vector
才是不错的选择。否则,您应该考虑切换到
std::deque
。标准中有什么东西可以代替我吗?
该标准提供了所有工具,可以通过您自己编写的函数尽可能高效地完成此操作。擦除(如有必要),然后插入。就这么简单。请记住两件事: