首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::array和std::vector有什么区别?你什么时候会用一种而不是其他?

std::array和std::vector有什么区别?你什么时候会用一种而不是其他?
EN

Stack Overflow用户
提问于 2011-07-09 13:30:53
回答 6查看 81.3K关注 0票数 119

std::arraystd::vector有什么区别?你什么时候会用一种而不是其他?

我一直将std:vector作为使用C数组的一种C++方式使用,那么有什么区别呢?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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)数组很小。

票数 159
EN

Stack Overflow用户

发布于 2011-07-09 13:40:20

另外,我假设您知道std::array不执行动态分配。因此,我将回答为什么要使用std::array而不是std::vector。

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

代码语言:javascript
运行
复制
std::vector<SomeType> vecName(10);

然后你从来没有实际增加std::vector的大小?如果是这样,那么std::array是一个很好的选择。

但实际上,std::array (与初始值设定项列表相结合)的存在使得C风格的数组几乎毫无价值。它们通常不会与std::vectors竞争;它们更多地与C风格的数组竞争。

可以把它看作是C++委员会在尽最大努力扼杀几乎所有合法使用C风格数组的行为。

票数 22
EN

Stack Overflow用户

发布于 2011-07-09 13:37:05

std::array

常量时间是一个集合,它的元素是默认可构造的(vs copy (C++03)或move (C++0x) )

  • 是线性可移动的(vs constant time)

  • potentially支付的间接费用比std::vector

少一个

一个很好的用例是在做“接近金属”的事情时,同时保持C++的精妙之处,并保持原始数组的所有不好的东西。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6632971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档