如何在std::vector指定偏移处写入数据并支持动态扩容?
解决方案
要实现指定偏移覆盖写入+自动扩容的逻辑,核心思路是先确保目标向量的容量足够容纳新数据,再覆盖对应位置的内容,具体步骤如下:
核心逻辑
- 计算写入后向量需要的最小长度:
偏移量 + 待写入数据长度 - 如果目标向量当前长度小于这个值,调用
resize()自动扩容(扩容后超出原长度的部分会被初始化为默认值,后续会被覆盖) - 使用
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写入时:
- 第一个文件(37956字节)写入时,向量会被调整为37956字节,覆盖原有内容(如果有的话)
- 第二个文件(53856字节)写入时,向量会扩容到53856字节,前37956字节覆盖为相同内容,后面的15900字节新增写入,最终向量长度正好是53856字节,不会出现插入导致的冗余数据
内容的提问来源于stack exchange,提问作者Schweini
相关产品推荐
相关产品推荐

