数组和向量的区别是什么? 什么时候使用一个而不是另一个?

std::arraystd::vector的区别是什么? 你什么时候使用它们?

我一直使用并考虑将 std:vector作为 C + + 使用 C 数组的方式,那么它们之间有什么区别呢?

83152 次浏览

std::array has a fixed (compile time) size, while std::vector can grow.

因此,std::array类似于使用 C 数组,而 std::vector类似于动态分配内存。

在使用 C 样式的 静电干扰数组而不是 std::vector时,也是同样的原因。关于这一点,请参考 给你

std::array只是经典 C 数组的一个类版本。这意味着它的大小在编译时是固定的,它将被分配为一个单独的块(例如,在堆栈上占用空间)。它的优点是性能稍好一些,因为对象和数组数据之间没有间接关系。

std::vector是一个包含指向堆的指针的小类。(因此,当您分配一个 std::vector时,它总是调用 new。)它们访问起来稍微慢一些,因为这些指针必须被追踪才能到达数组数据... ... 但是作为交换,它们可以被调整大小,而且不管它们有多大,它们只占用微不足道的堆栈空间。

[编辑]

As for when to use one over the other, honestly std::vector is almost always what you want. Creating large objects on the stack is generally frowned upon, and the extra level of indirection is usually irrelevant. (For example, if you iterate through all of the elements, the extra memory access only happens once at the start of the loop.)

向量的元素保证是连续的,因此您可以将 &vec[0]传递给任何希望指向数组的函数; 例如,C 库例程。(顺便说一句,std::vector<char> buf(8192);是为调用 read/write或类似方法而不直接调用 new分配本地缓冲区的好方法。)

也就是说,缺少额外的间接级别,再加上编译时的常量大小,可以使得对于经常被创建/销毁/访问的极小阵列来说,std::array的速度明显加快。

So my advice would be: Use std::vector unless (a) your profiler tells you that you have a problem 还有 (b) the array is tiny.

std::array

  • is an aggregate
  • 是固定大小的
  • 需要它的 元素是默认可构造的(vs 复制(C + + 03)或移动(C + + 0x) 可建筑物)
  • 是线性的 可切换的(与固定时间相比)
  • 是线性可移动的(与常数时间相比)
  • 可能支付的间接比 std::vector少一个

一个好的用例是当做事情“接近金属”的时候,同时保持 C + + 的细节和保持所有原始数组的坏东西的方式。

I'm going to assume that you know that std::array is compile-time fixed in size, while std::vector is variable size. Also, I'll assume you know that std::array doesn't do dynamic allocation. So instead, I'll answer 为什么 you would use std::array instead of std::vector.

你有没有发现自己这样做过:

std::vector<SomeType> vecName(10);

然后你从来没有实际增加大小的标准: : 向量? 如果是这样,那么标准: : 数组是一个很好的选择。

But really, std::array (coupled with initializer lists) exists to make C-style arrays almost entirely worthless. They don't generally compete with std::vectors; they compete more with C-style arrays.

可以把它想象成 C + + 委员会正在尽最大努力扼杀几乎所有合法使用 C 风格数组的做法。

我使用我自己的手工编码的 Array<>模板类,与 std::arraystd::vector相比,它有一个更简单的 API。例如:

使用动态数组:

Array<>  myDynamicArray; // Note array size is not given at compile time
myDynamicArray.resize(N); // N is a run time value


...

要使用静态 Array,在编译时固定大小:

Array<100> myFixedArry;

我相信它比 std::array或者 std::vector有更好的语法,而且非常高效。