std :: array和std :: vector有什么区别?你什么时候使用其他?

时间:2011-07-09 05:30:53

标签: c++ arrays vector

std::arraystd::vector之间有什么区别?你何时使用其他人?

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

6 个答案:

答案 0 :(得分:153)

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

std::vector是一个包含指向堆的指针的小类。 (所以当你分配一个std::vector时,它总是调用new。)它们的访问速度稍慢,因为这些指针必须被追逐以获取阵列数据...但是为了换取它,它们可以调整大小,无论它们有多大,它们只占用很少的堆栈空间。

[编辑]

至于何时使用其中一个,老实说std::vector几乎总是你想要的。通常不赞成在堆栈上创建大对象,并且额外的间接级别通常是无关紧要的。 (例如,如果遍历所有元素,额外的内存访问只在循环开始时发生一次。)

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

也就是说,缺少额外的间接级别加上编译时常量大小,可以使std::array显着加快一个非常小的数组,这个数组会被大量创建/销毁/访问。

所以我的建议是:使用std::vector除非(a)你的探查器告诉你有问题(b)阵列很小。

答案 1 :(得分:22)

我将假设你知道std :: array的编译时是固定大小的,而std :: vector是可变大小的。另外,我假设您知道std :: array不进行动态分配。所以相反,我会回答为什么你会使用std :: array而不是std :: vector。

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

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

然后你从未真正增加std :: vector的大小?如果是这样,那么std :: array是一个不错的选择。

但实际上,std :: array(加上初始化列表)的存在使C风格的数组几乎完全没用。它们通常不与std :: vectors竞争;他们与C风格阵列竞争更多。

将其视为C ++委员会尽最大努力消灭几乎所有合法使用的C风格数组。

答案 2 :(得分:14)

std::array

  • 是聚合
  • 是固定大小的
  • 要求它 元素是默认可构造的(vs 复制(C ++ 03)或移动(C ++ 0x) constructible)
  • 是线性的 可交换(对比恒定时间)
  • 可线性移动(相对于恒定时间)
  • 可能比std::vector
  • 支付少一个间接费用

一个很好的用例就是在做“接近金属”的事情时,同时保留C ++的细节并保持原始数组的所有不良内容不受影响。

答案 3 :(得分:9)

使用C风格的静态数组而不是std::vector时的相同推理。为此,我恳请您参考here

答案 4 :(得分:8)

std::array具有固定(编译时)大小,而std::vector可以增长。

因此,std::array就像使用C数组一样,而std::vector就像动态分配内存一样。

答案 5 :(得分:2)

我使用自己的个人手工编码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<100> myFixedArry;

我认为它的语法比std::arraystd::vector更好。也非常有效率。