左边修剪一个没有内存副本的std :: vector

Gra*_*pes 1 c++ vector

假设我们在内存中读取了一个100MB的大文件:

std::vector<unsigned char> paddedName = { '0', '0', '0', 'T', 'O', 'M'/*... 100MB+ of data ... */ };
Run Code Online (Sandbox Code Playgroud)

如何删除前三个字符并使用填充数据创建一个新向量,同时丢弃旧的向量数据?

这是复制操作的样子:

std::vector<unsigned char> unpaddedName(paddedName.begin() + 3, paddedName.end());
Run Code Online (Sandbox Code Playgroud)

但我们显然不想复制100MB内存只是为了从头开始擦除3个字符.

那么有更好的方法吗?

Mik*_*our 9

如果必须vector,那么你不能.向量维护一个连续的数组,只允许您调整其大小(从末尾添加或删除),而不是它的起始点,因此从开始添加或删除需要移动其余元素.

您可以使用a deque,允许从两端删除.或者您可以安排在将不需要的字符读入矢量时跳过它们,而不是在以后删除它们.或者您可以将自己的指针/迭代器维护到有效数据的开头,并使用它而不是paddedName.begin().您可以将其概括为"视图"类,其中包含一对指针/迭代器以表示基础向量的子范围,并使用它来仅访问所需的数据.