一次性将pd :: array全部pilfering而不是逐个元素

时间:2018-03-27 00:22:49

标签: c++ c++11

如果您有vector并将vector分配给另一个vector,则会逐个复制元素,您将获得两个相同的副本。

当您移动vector到另一个vector时,整个内部阵列立即被盗。元素不会逐个移动。

移动时,将std::array分配给另一个std::array元素,逐个移动到新数组。

为什么std::array不执行矢量操作,一次盗取整个内部数组而不是逐个移动元素?

4 个答案:

答案 0 :(得分:2)

std::array的基本观点是它的内容纯粹是一个内置的数组对象,该类提供语法糖,但不会增加数据表示的开销(根本)。

vector通常由至少包含三个项目的结构组成:

  1. 指向数据的指针
  2. 分配的数据大小
  3. 正在使用的数据大小
  4. 当您移动vector时,您基本上只能“偷”"这三项,无需复制数据本身的内容。最终得到一个包含指向相同数据的指针的新结构。

    使用std::array消除了指向数据的指针,这意味着只需复制指针就无法移动内容。

答案 1 :(得分:1)

std::vector分配和管理数组。 std::array 是一个数组。你不能再偷窃"偷窃"来自std::array的数组比你可以"盗窃"来自int的整数。

答案 2 :(得分:1)

因为没有“内部”数组。 std::array 数组,没有单独的指针可以像vector一样转让所有权。每个数组都是 N元素的内存,它们无法交换。

答案 3 :(得分:0)

不同之处在于,一个容器(vector)包含指向数据缓冲区的指针,而std::array包含数据本身。创建具有成员int arr[100]的类和创建具有成员int* arr的类之间的区别。你可以更有效地移动"具有单个int*到缓冲区的类,而不是复制100个成员的数组。