std::array
和std::vector
有什么区别?你什么时候会用一种而不是其他?
我一直将std:vector
作为使用C数组的一种C++方式使用,那么有什么区别呢?
发布于 2011-07-09 13:35:38
std::array
只是经典C数组的一个类版本。这意味着它的大小在编译时是固定的,它将被分配为单个块(例如,占用堆栈上的空间)。它的优点是性能稍好一些,因为在对象和阵列数据之间没有间接性。
std::vector
是一个包含指向堆的指针的小类。(因此,当您分配std::vector
时,它总是调用new
。)它们的访问速度稍慢,因为必须追逐这些指针才能到达数组数据……但作为交换,它们可以调整大小,并且它们只占用很少的堆栈空间,无论它们有多大。
编辑
至于何时使用一种而不是另一种,老实说,std::vector
总是你想要的。在堆栈上创建大型对象通常是不受欢迎的,而且额外的间接级别通常是无关紧要的。(例如,如果遍历所有元素,则额外的内存访问仅在循环开始时发生一次。)
向量的元素保证是连续的,因此您可以将&vec[0]
传递给任何需要指向数组的指针的函数;例如,C库例程。(顺便说一句,std::vector<char> buf(8192);
是一种很好的方法,可以为对read/write
或类似的调用分配本地缓冲区,而无需直接调用new
。)
也就是说,缺少额外的间接性,再加上编译时的常量大小,对于经常创建/销毁/访问的非常小的数组,std::array
的速度会大大提高。
所以我的建议是:使用std::vector
,除非(a)你的分析器告诉你有问题,(b)数组很小。
发布于 2011-07-09 13:40:20
另外,我假设您知道std::array不执行动态分配。因此,我将回答为什么要使用std::array而不是std::vector。
你有没有发现自己这样做过:
std::vector<SomeType> vecName(10);
然后你从来没有实际增加std::vector的大小?如果是这样,那么std::array是一个很好的选择。
但实际上,std::array (与初始值设定项列表相结合)的存在使得C风格的数组几乎毫无价值。它们通常不会与std::vectors竞争;它们更多地与C风格的数组竞争。
可以把它看作是C++委员会在尽最大努力扼杀几乎所有合法使用C风格数组的行为。
发布于 2011-07-09 13:37:05
std::array
常量时间是一个集合,它的元素是默认可构造的(vs copy (C++03)或move (C++0x) )
std::vector
少一个
一个很好的用例是在做“接近金属”的事情时,同时保持C++的精妙之处,并保持原始数组的所有不好的东西。
https://stackoverflow.com/questions/6632971
复制相似问题