std::array
和std::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::array
或std::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::array
或std::vector
有更好的语法。效率也非常高。