std :: array和std :: vector有什么区别? 你什么时候使用其他的?
std::array
和std::vector
什么区别? 你什么时候使用其他的?
我一直使用和考虑std:vector
作为使用C数组的C ++方式,所以有什么区别?
std::array
只是传统C数组的一个类版本。 这意味着它的大小在编译时是固定的,它将被分配为一个单独的块(例如,占用堆栈空间)。 它所具有的优点是性能稍微好一点,因为对象和arrays数据之间没有间接的关系。
std::vector
是一个包含指向堆的指针的小类。 (所以当你分配一个std::vector
,它总是调用new
。)它们访问速度稍慢,因为这些指针必须被追赶才能到达数组数据……但作为交换,它们可以resize,无论它们多大,它们只占用一小堆栈空间。
[编辑]
至于什么时候使用一个,诚实的std::vector
几乎总是你想要的。 在堆栈上创build大对象通常是不被接受的,额外的间接级别通常是不相关的。 (例如,如果遍历所有元素,额外的内存访问只在循环开始时发生一次。)
向量的元素保证是连续的,所以你可以将&vec[0]
传递给期望指向数组的指针的任何函数; 例如C库例程。 (顺便说一句, std::vector<char> buf(8192);
是一个很好的方式来分配一个本地缓冲区的调用read/write
或类似的,没有直接调用new
。)
也就是说,缺less这种额外的间接级别,加上编译时常量的大小,可以使得std::array
对于被创build/销毁/访问的非常小的数组显着加快。
所以我的build议是:使用std::vector
除非(a)你的分析器告诉你,你有问题, (b)数组很小。
我假设你知道std :: array是编译时固定的大小,而std :: vector是可变大小。 另外,我会假设你知道std :: array不会做dynamic分配。 所以相反,我会回答为什么你会使用std ::数组而不是std :: vector。
你有没有发现自己这样做:
std::vector<SomeType> vecName(10);
然后你永远不会增加std :: vector的大小? 如果是这样,那么std :: array是一个很好的select。
但是真的,std :: array(与初始化列表结合)存在,使C风格的数组几乎完全没有价值。 他们通常不会与std :: vectors竞争; 他们与C风格的arrays竞争更多。
把它看作是C ++委员会尽其所能地杀死几乎所有合法使用C风格的arrays。
std::array
- 是一个聚合
- 是固定大小的
- 要求其元素是默认可构造的(vs复制(C ++ 03)或移动(C ++ 0x)可构造的)
- 是可线性交换的(vs constant time)
- 是线性可移动的(vs恒定时间)
- 可能比
std::vector
支付更less的间接性
一个很好的用例就是在做“贴近金属”的时候,同时保持C ++的精确性,并且保留原始数组的所有不好的东西。
使用C风格静态数组而不是std::vector
时,同样的推理。 为此,我恳请你到这里 。
std::array
有一个固定的(编译时间)大小,而std::vector
可以增长。
因此, std::array
就像使用C数组,而std::vector
就像dynamic分配内存。
我使用自己的手工编码Array<>
模板类,与std::array
或std::vector
相比,它具有更简单的API。 例如:
要使用dynamic数组:
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
更好的语法。 也非常有效。
vector对数组的一个优点是可以使用vector_name.size()来查找vector的当前大小 。
正如你可以想象的,这可以在各种情况下非常有用,你可以很容易的在array_list中获取元素的数量。