std::array和std::vector的区别是什么?什么时候你用一个而不是另一个



std::arraystd::vector的区别是什么?你什么时候用一个而不是另一个?

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

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

std::vector是一个包含指向堆的指针的小类。(所以当你分配一个std::vector时,它总是调用new。)它们的访问速度略慢,因为必须跟踪这些指针才能获得数组数据……但作为交换,它们可以调整大小,并且无论它们有多大,它们只占用少量的堆栈空间。

[编辑]

至于何时使用其中一个而不是另一个,老实说,std::vector几乎总是你想要的。在堆栈上创建大型对象通常是不受欢迎的,额外的间接层通常是无关紧要的。(例如,如果遍历所有元素,则在循环开始时只进行一次额外的内存访问。)

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

也就是说,缺乏额外的间接级别,加上编译时常量大小,可以使std::array对于创建/销毁/访问很多的非常小的数组显着更快。

所以我的建议是:使用std::vector,除非(a)你的分析器告诉你你有一个问题 (b)数组很小。

我假设您知道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风格数组的合法使用。

std::array

  • 是一个集合
  • 是固定大小
  • 要求其元素是默认可构造的copy (c++ 03)或move (c++ 0x)可构成的)
  • 是线性的可切换(vs恒定时间)
  • 线性移动(相对于恒定时间)
  • 可能比std::vector
  • 少支付一次间接费用

一个好的用例是在做"接近金属"的事情时,同时保持c++的细节,并保持原始数组的所有不好的东西。

在使用c风格的静态数组而不是std::vector时也是同样的道理。为此,我建议您参考这里

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

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

我使用我自己手工编写的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有更好的语法。效率也非常高。

相关内容

最新更新