如何在不导致复制的情况下将 char 数据附加到 std::vector

How to append char data to a std::vector without causing a copy

我有一个包含一些数据元素的字符向量。

std::vector<unsigned char> data_1;

我有一个 unsigned char * 指向另一组数据元素。

unsigned char * data_2;

问题:
有没有一种方法可以将 data_2 合并到 data_1 这是一个向量,而根本不会导致数据元素的副本?

我读到 this discussion 中提到的移动语义,但我有点不确定在我这里的这种情况下是否可行。

不,你不能那样做。

  • 矢量数据是连续存储的,因此除非您的缓冲区已经 back-to-back 不知何故(实际上不是),否则至少需要移动其中一个(阅读:复制)

  • 向量无法取得现有内存的所有权(您的unsigned char* data_2

  • 向量不能同时拥有两个内存块(假设std::vector<unsigned char> data_2

但是,您可以在使用时,没关系 having a single iterator type "jump" from the first buffer to the second, transparently

没有。 vector 是连续存储的;虽然您可以通过在填充 data_1 之前 reserve 足够 space 来避免重新分配 data_1 以获取串联数据的完整大小,但您无法避免实际副本字节;数据必须移动到与 data_1 中现有数据相邻的位置,而 vector 无法避免这种情况。

Is there a way I can merge data_2 into data_1 which is a vector without causing a copy of the data elements at all?

没有。所有将元素插入向量的方法都需要至少复制(或移动)每个元素一次。

I read about move semantics being referred in this discussion but I am a bit unsure if it is possible in this situation I have here.

移动字符与复制字符相同。这种区别仅与具有 non-trivial 移动构造函数或移动赋值运算符的 class 类型相关。

It wouldn't be possible even if data_2 was a std::vector<unsigned char>?

追加而不复制(或移动)即使那样也是不可能的。

旁注 1:您可以使用向量的移动赋值运算符 用另一个向量的内容替换 一个向量的全部内容,而无需复制(或移动)任何元素。

旁注 2:您 可以 合并两个基于节点的容器实例,例如 std::lists、std::sets、std::maps 和他们的无序副本没有复制(也没有移动)任何元素。

是的,你可以。但是你必须为向量定制分配器。

默认情况下,vector 使用 std::allocator, and you may use vector::get_allocator 获取分配器对象。您可以尝试使用 allocator::construct 方法进行一些操作(我没有深入研究)。

当您实例化一个 vector 时,您可以将一个 custom-allocator 传递给向量,这将有助于使用已经分配的内存(placement new),或任何其他内存分配函数。 This article 可能会有帮助。

但是,我认为这样的努力并没有真正的成果。