首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::数组与std::向量细微差异

std::数组与std::向量细微差异
EN

Stack Overflow用户
提问于 2013-05-05 02:12:21
回答 5查看 1.7K关注 0票数 3

我想和std::array混在一起,看看它和std::vector有多大的不同。到目前为止,我只发现了一个主要的区别。

代码语言:javascript
复制
Sentence sentence = { "Hello", "from", "GCC", __VERSION__, "!" };  
std::array<std::string, 10> a;
std::copy(sentence.begin(), sentence.end(), a.begin());

int i = 0;
for (const auto& e : a)
{
    i++;
    std::cout << e << std::endl;
}
std::cout << i << std::endl;

// outputs 10

i = 0;
for (const auto& e : sentence)
{
    i++;
    std::cout << e << std::endl;
}
std::cout << i << std::endl;

// outputs 5

for (int i = 0; i < a.size(); i++)
    std::cout << i << " " << a[i] << std::endl;

// outputs 0 Hello
// ...
//         4 !
//         5-9 is blank

for (int i = 0; i < sentence.size(); i++)
    std::cout << i << " " << sentence[i] << std::endl;

// outputs 0 Hello
// ...
//         4 !
// stops here


// The following outputs the same as above
i = 0;

for (auto it = a.begin(); it != a.end(); it++)
{
    std::cout << i << " " << *it << std::endl;
    i++;
}
std::cout << i << std::endl;
i = 0;
for (auto it = sentence.begin(); it != sentence.end(); it++)
{
    std::cout << i << " " << *it << std::endl;   
    i++;
}
std::cout << i << std::endl;

因此,在我看来,std::arraysizemax_size是多余的,但std::vectorsizecapacity可能是不同的,也可能是相同的。这一点甚至可以从这句话中得到证实:

数组对象的大小和max_size总是匹配的。

那么,为什么std::array有冗余大小函数呢?更重要的是,您是否认为std::array的大小不一定与std::vector的大小相同,因为向量具有容量?这是否意味着std::arrays是安全的(也就是说,它们有像向量一样的智能指针管理?)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-05 02:25:29

capacity in vectorvector..which的最大容量,可能与其size相同,也可能不相同。sizevector中当前的元素数。

出于性能原因,如果预先知道矢量的最大大小(或进行猜测),则可以预先确定向量的容量(而不是使用其默认值)。这可能大大提高代码的性能,因为您不必在每次迭代中重新分配(当您添加元素时)。

http://www.cplusplus.com/reference/vector/vector/capacity/

票数 3
EN

Stack Overflow用户

发布于 2013-05-05 02:21:52

使它与其他容器兼容。

这样,您就可以拥有一个模板函数,它接受任何集合,并确保它将同样工作,无论它是std::vector还是std::array

票数 6
EN

Stack Overflow用户

发布于 2013-05-05 03:30:28

更重要的区别是,std::vector有一个resize函数,而std::array没有。

std::array实例的大小(就像普通数组的大小一样)在实例化时是固定的(实际上,它的大小必须在编译时知道,并且是一个常量表达式)。但是,在运行时实例化std::vector实例之后,可以调整它的大小。

另外,不同尺寸的std::arrays是不同的类型,而不同尺寸的std::vectors是相同的。

std::array上使用std::vector的唯一原因是,std::array占用的空间更少,速度更快。std::vector需要存储它的大小和指向堆分配的后备存储的指针,该存储可能有额外的填充以允许调整大小。std::array被就地分配(没有间接指针),它的size函数也是静态的,所以对std::array.size()的调用将编译为一个常量(实际上是一个constexpr函数)。

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

https://stackoverflow.com/questions/16380740

复制
相关文章

相似问题

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