【问题标题】:Should I use std::vector instead of array [duplicate]我应该使用 std::vector 而不是数组 [重复]
【发布时间】:2017-03-05 18:26:59
【问题描述】:

在我看来,它们都有相同的功能,除了 std::vector 似乎更灵活,所以我什么时候需要使用数组,我可以只使用 std::vector 吗? 这不是一个新问题,原来的问题没有我想要的答案

【问题讨论】:

  • 如果您需要一个“动态”数组,那么std::vector 是自然的解决方案。它通常应该是所有东西的默认容器。但是,如果您希望在编译时创建一个静态大小的数组(就像 C 样式的数组一样)但包装在一个不错的 C++ 对象中,那么std::array 可能是更好的选择。
  • 当您不需要std::vector 的灵活性时,使用数组(或std::array)是明智的。
  • 动态内存,堆?
  • 几乎没有理由在 C++ 中使用老式数组,除非您有非常严格的性能要求(尽管一个好的编译器应该能够生成可比较的代码),或者您正在与C API(尽管有 std::arraystd::vector 方法将返回指向底层 C 数组的指针)。

标签: c++ arrays stdvector


【解决方案1】:

需要注意的一件有趣的事情是,虽然迭代器在许多带有向量的函数中会失效,但数组并非如此。注意:std::swapstd::array 迭代器仍将指向同一个位置。

查看更多: http://en.cppreference.com/w/cpp/container/array

很好地总结了数组的优点: https://stackoverflow.com/a/4004027/7537900

这一点似乎最有趣:

固定大小的数组可以直接嵌入到结构或对象中, 这可以提高内存局部性并减少堆的数量 需要分配

没有测试过,但我不确定它是否真的如此。

以下是关于 Code Chef 中竞争性编程的 2D 向量与数组的讨论: https://discuss.codechef.com/questions/49278/whether-to-use-arrays-or-vectors-in-c

显然,二维向量中的二维内存不是连续的,只有一维,但在二维数组中是连续的。

【讨论】:

    【解决方案2】:

    使用 std:vector 时,唯一的性能损失将是达到容量时,因为必须重新定位内存以在堆上的连续内存空间中容纳大量对象

    因此,这里是关于灵活性和性能的总结:

    标准::数组;重新分配是不可能的,因此不会由于堆上的内存重定位而发生性能损失。

    std::vector;仅在超出容量并发生重新分配时才会影响性能。您可以使用 reserve(size) 粗略估计您需要的最大对象数量。与 std::array 相比,这提供了更大的灵活性,但当然,如果超出保留空间,则必须重新分配内存。

    【讨论】:

      【解决方案3】:

      根据经验,您应该使用:

      • 如果大小在编译时固定,则为 std::array
      • std::vector 的大小在编译时不固定
      • 指向第一个元素地址的指针是您需要低级访问权限
      • 如果您正在实现(非标准)容器,则为原始数组

      即使您将标准容器传递给其他函数时,标准容器也能够知道它们的大小,知道原始数组不知道什么,并且有足够的优势在没有特定原因的情况下从不使用 C++ 代码中的原始数组。一个可能是需要低级别优化的瓶颈,但只有在分析以确定瓶颈之后。您应该在实际条件下进行基准测试,标准容器是否确实增加了任何过载。

      我能想到的唯一好理由是如果你实现了一个特殊的容器。由于标准容器并不意味着派生,因此您只有两个选择,要么让您的类包含一个标准容器,然后在一个包含随处可见的容器的容器中结束,或者 模仿 一个标准容器(通过从众所周知的实现中复制代码),并对其进行专门化。在这种情况下,您会发现自己直接管理原始数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-26
        • 2023-04-04
        • 2023-02-09
        • 2017-04-07
        • 2015-06-04
        • 2013-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多