首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std函数用于替换向量中的字节范围

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

Stack Overflow用户
提问于 2017-03-13 19:50:09
回答 3查看 2.1K关注 0票数 4

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

我想用未知的字节长度替换字节3-6 (我在运行时就知道了)。因此,矢量的长度可能增长、减少或保持不变。但我知道要替换的字节的起始点和结束点。

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

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

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

EN

回答 3

Stack Overflow用户

发布于 2017-03-13 20:58:28

如果这些值都相同,并且您知道要替换的间隔在向量内,则使用std::fill

代码语言:javascript
运行
复制
std::fill(v.begin() + 3, v.begin() + 6, 9);

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

如果您要放置的值不完全相同,请改用std::copy (您需要确保替换内容适合向量):

代码语言:javascript
运行
复制
std::copy(replacement.begin(), replacement.end(), v.begin() + 3); 

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

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

代码语言:javascript
运行
复制
v.resize(6);
票数 3
EN

Stack Overflow用户

发布于 2017-03-13 19:54:23

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

票数 2
EN

Stack Overflow用户

发布于 2017-03-13 20:16:28

简短回答:除非我们从你那里得到更多细节,否则你的问题没有最终的解决方案

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

  1. 你将保持容器的大小不变,向量对于这个
  2. 是完美的,你可以从中间改变向量的大小,而向量的大小在这方面是可怕的!但是,std::deque在这方面是一个中间立场。这样做的原因是here。它完全支持在(几乎)恒定的时间内做你想做的事情,并在恒定的时间提供元素访问。

你需要回答的问题是:与不会改变向量大小的替换相比,你需要多久进行一次替换?只有当向量大小的变化非常小时,std::vector才是一个很好的选择。否则,您应该考虑切换到std::deque

在标准中有没有什么东西可以代替我呢?

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

如果你想要删除的部分的大小等于你想要放入的数组的大小,那么better

  • Always
  1. 就会考虑特殊的情况。在这种情况下,不要删除或插入任何内容。这在performance.

中节省了大量资源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42762946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档