【问题标题】:When do we use arrays over vectors in C++ and vice versa?我们什么时候在 C++ 中使用数组而不是向量,反之亦然?
【发布时间】:2021-12-10 08:22:24
【问题描述】:

我从this link看到了以下内容:

向量是 STL 的一部分。 C++ 中的向量是序列容器,表示可以在运行时改变其大小的数组。它们为元素使用连续的存储位置,就像在数组中一样有效,这意味着它们的元素也可以使用指向其元素的常规指针上的偏移量来访问。

向量是用于存储数据的动态数组。它不同于存储顺序数据并且本质上是静态的数组,向量为程序提供了更大的灵活性。向量可以在插入或删除元素时自动调整其大小。

如果向量可以做这么多,在什么情况下我们仍然更喜欢数组?

谢谢!

【问题讨论】:

  • 如果数组的大小在编译时已知且不是很大的数字,则无需动态分配内存
  • 数组的创建和销毁速度略快,内存开销也略少(零)。
  • 容器的大小在编译时是否已知?它会在程序的整个生命周期中保持相同的大小吗?根据用例,可以将容器数据分配为局部变量(即在堆栈上)吗?然后去找一个数组。
  • @Erin -- 你知道std::array 存在吗?此外,您拥有的链接有:#include <bits/stdc++.h> -- 不要从该站点学习 C++。
  • @Erin:是的,有点。 vector 需要newdelete 内存来存储对象,这需要一定的时间,并且它还有内部数据成员来跟踪大小,容量,指向数据的指针等(@ 987654322@) 占用的内存超出了存储对象所需的内存。原始数组和std::array 没有这些。

标签: c++ arrays vector data-structures


【解决方案1】:

如果向量可以做这么多,在什么情况下我们仍然更喜欢数组?

一个好的设计不是没有什么可添加的,而是没有什么可删除的。或者仅在需要时引入额外的复杂性。

【讨论】:

    【解决方案2】:

    std::vector 的一个主要缺点是它在必须增长时使用动态内存分配,这在执行时间方面可能非常昂贵。因此,在已知合理上限的情况下,使用固定长度数组可能会更好,即使这会浪费内存空间。这个决定是一个空间/时间trade-off

    但是,std::vector 的这个缺点可以通过调用std::vector::reserve 提前为一定数量的元素保留内存来缓解。

    使用std::vector 的另一个缺点是serialization 明显更难。例如,如果您将std::array 设为struct 的成员,那么您可以简单地逐字节复制整个struct 内容以便对其进行序列化。但是,如果您将std::vector 设为struct 的成员,则这是不可能的,因为它可能不会将实际数据存储在struct 中,而可能只会存储指向数据的指针。因此,您将无法通过简单地复制struct 的内存来序列化struct。相反,序列化std::vector 需要特殊处理。

    【讨论】:

    • 但是如果容器需要增长,那么数组首先不是一个选项。
    • @NateEldredge:根据情况,可以知道合理的上限,并且可以使数组具有该大小。但是,您是对的,在许多情况下这可能会浪费空间。因此,决定使用std::vector 还是std::array 通常是空间/时间的权衡。
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2010-11-14
    • 2011-12-07
    • 2010-10-23
    • 1970-01-01
    • 2017-10-21
    • 2015-09-10
    • 2013-10-25
    相关资源
    最近更新 更多