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

Alo*_*ave 115 c++ arrays vector

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

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

Nem*_*emo 155

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

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

[编辑]

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

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

也就是说,缺少额外的间接级别,加上编译时常量,可以std::array大大加快创建/销毁/访问的非常小的数组.

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

  • @Xeo:那不是指针; 这是一个数组.它实际上是_inside_对象; 没有被对象_指向.如果查看生成的asssembly代码,您会发现访问vector元素涉及的内存访问比数组多一个.(虽然在实践中它通常是无关紧要的;例如,循环遍历向量只在循环开始时进行一次额外的间接.) (11认同)
  • @Xeo:不完全:`std :: vector`的数据存储在单独分配的内存中.`std :: array`的数据不是.(当你需要评论时,哪里是-1按钮?) (6认同)

Nic*_*las 22

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

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

std::vector<SomeType> vecName(10);
Run Code Online (Sandbox Code Playgroud)

那你从来没有真正增加std :: vector的大小?如果是这样,那么std :: array是一个不错的选择.

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

可以把它想象成C++委员会尽最大努力消灭几乎所有合法使用的C风格数组.


Luc*_*ton 14

std::array

  • 是一个聚合
  • 是固定大小的
  • 要求其元素是默认可构造的(vs copy(C++ 03)或move(C++ 0x)可构造)
  • 是可线性交换的(与常数时间相比)
  • 是可线性移动的(相对于恒定时间)
  • 可能比间接费用减少一个间接费用 std::vector

一个很好的用例是在做"接近金属"的事情时,同时保留C++的细节并保持原始数组的所有坏处.


Xeo*_*Xeo 9

使用C风格静态数组而不是使用C风格静态数组时的相同推理std::vector.为此,我恳请您到这里.


Eti*_*tel 8

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

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