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

时间:2015-02-06 17:08:09

标签: c++ vector

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

std::vector<unsigned char> paddedName = { '0', '0', '0', 'T', 'O', 'M'/*... 100MB+ of data ... */ };

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

以下是复制操作的样子:

std::vector<unsigned char> unpaddedName(paddedName.begin() + 3, paddedName.end());

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

那么有更好的方法吗?

1 个答案:

答案 0 :(得分:9)

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

您可以使用deque,允许从两端删除。或者您可以安排在将不需要的字符读入矢量时跳过它们,而不是在以后删除它们。或者您可以将自己的指针/迭代器维护到有效数据的开头,并使用它而不是paddedName.begin()。您可以将其推广到&#34;视图&#34; class,包含一对指针/迭代器,用于表示底层向量的子范围,并使用它来仅访问所需的数据。