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

std::arraystd::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::arraystd::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::arraystd::vector更好的语法。 也非常有效。

vector对数组的一个优点是可以使用vector_name.size()来查找vector的当前大小

正如你可以想象的,这可以在各种情况下非常有用,你可以很容易的在array_list中获取元素的数量。