You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在std::vector指定偏移处写入数据并支持动态扩容?

解决方案

要实现指定偏移覆盖写入+自动扩容的逻辑,核心思路是先确保目标向量的容量足够容纳新数据,再覆盖对应位置的内容,具体步骤如下:

核心逻辑

  1. 计算写入后向量需要的最小长度:偏移量 + 待写入数据长度
  2. 如果目标向量当前长度小于这个值,调用resize()自动扩容(扩容后超出原长度的部分会被初始化为默认值,后续会被覆盖)
  3. 使用std::copy或memcpy将待写入数据复制到目标向量的指定偏移位置,覆盖原有内容

代码实现(对应你的实际场景)

在RepackFile函数的注释处替换为以下代码:

// 计算写入后需要的最小向量长度
size_t required_size = file_section.offset + file_data.size();

// 自动扩容:如果当前向量长度不足,调整到需要的大小
if (data_file_data.size() < required_size) {
    data_file_data.resize(required_size);
}

// 覆盖写入数据(用std::copy更符合STL风格,也可以用memcpy提升效率)
std::copy(file_data.begin(), file_data.end(), data_file_data.begin() + file_section.offset);

// 或者用memcpy(因为是uint8_t,内存操作更高效)
// memcpy(data_file_data.data() + file_section.offset, file_data.data(), file_data.size());

对应基础需求的验证

比如你的基础场景:

  • 原向量b = {0, 3, 6}(长度3)
  • 待写入向量a = {0, 3, 6, 8}(长度4),写入偏移为0
  • 计算required_size = 0 + 4 = 4,b.resize(4)后长度变为4
  • 执行copy后,b的内容被覆盖为{0, 3, 6, 8},完全符合需求

针对你的实际问题的说明

当两个文件都从偏移0写入时:

  1. 第一个文件(37956字节)写入时,向量会被调整为37956字节,覆盖原有内容(如果有的话)
  2. 第二个文件(53856字节)写入时,向量会扩容到53856字节,前37956字节覆盖为相同内容,后面的15900字节新增写入,最终向量长度正好是53856字节,不会出现插入导致的冗余数据

内容的提问来源于stack exchange,提问作者Schweini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:22:44