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

偷窃std::一次全部数组,而不是逐个元素

  •  1
  • code  · 技术社区  · 8 年前

    当你有 vector 然后分配 矢量 给另一个人 矢量 ,元素将逐1复制,得到两个相同的副本。

    移动时指定 矢量 给另一个人 矢量 ,则整个内部阵列将立即被窃取。元素不会逐1移动。

    移动时,指定 std::array 给另一个人 std::阵列 元素逐1移动到新阵列。

    为什么? std::阵列 不会像vector那样,一次窃取整个内部数组,而不是逐个移动元素?

    4 回复  |  直到 8 年前
        1
  •  2
  •   Jerry Coffin    8 年前

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

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

    1. 指向数据的指针
    2. 分配的数据大小
    3. 数据的使用中大小

    当您移动 矢量 ,您基本上可以“窃取”这三项,而不必复制数据本身的内容。最终得到一个包含指向相同数据的指针的新结构。

    使用 std::阵列 消除指向数据的指针,这意味着您不能仅通过复制指针来移动内容。

        2
  •  1
  •   Nicol Bolas    8 年前

    A. std::vector 分配和管理阵列。A. std::array 是一个数组 。您不能再从 std::阵列 然后可以从 int

        3
  •  1
  •   ShadowRanger    8 年前

    因为没有“内部”数组。 std::array 数组中,没有单独的指针可以像 vector 。每个阵列 N 元素的内存价值,无法交换。

        4
  •  0
  •   sfjac    8 年前

    区别在于一个容器( vector )包含指向数据缓冲区的指针,而 std::array 保存数据本身。这是创建具有成员的类之间的区别 int arr[100] 并创建一个包含成员的类 int* arr 。您可以使用单个 int* 而不是复制由100个成员组成的数组。