代码之家  ›  专栏  ›  技术社区  ›  Oblivion

std::vector是否可以复制?为什么?

  •  1
  • Oblivion  · 技术社区  · 7 年前

    我遇到一个问题 std::vector<T> 在哪里 T 是一个内置类型,表示向量不可复制。

    我想知道这是否正确,我在寻找原因。

    2 回复  |  直到 7 年前
        1
  •  0
  •   doron    7 年前

    vector 随着数据的添加而增长。这意味着不需要预先知道存储所有数据需要多少空间。这个 矢量 通过在堆上分配(和重新分配)单独的存储缓冲区来解决这个问题。这个缓冲区是在内部管理的,同时提供一个接口,可以作为一个可变大小的数组。

    现在,如果一个对象是可构造的,那么应该能够简单地使用 memcpy(dest, &a, sizeof(a)) . 如果有人为了一个 矢量 ,其中一个将有两个向量对象指向同一个存储缓冲区。这将导致可怕的未定义行为。因此,复制向量需要复制内部存储,复制其参数,然后设置内部指针指向正确的存储缓冲区。这需要对对象进行内部了解。

    std::array 但是,在编译时设置了静态大小。它没有内部指针,因此可以使用 memcpy . 因此,复制是微不足道的。

        2
  •  5
  •   Igor Tandetnik    7 年前

    形式上,A std::vector<T> (对于任何 T 不是 trivially copyable 因为它的复制构造函数不是 trivial 如果只是因为它是用户提供的(而不是隐式定义的)。

    实际上,复制一个向量不仅仅需要对其数据成员进行一个简单的复制——它需要在堆上分配一个内存缓冲区,并从另一个向量的堆分配缓冲区复制其内容。