元素在 std::vector 和 std::d eque 中的连续存储位置

Elements' contiguous storage locations in std::vector and std::deque

本文关键字:std 连续 位置 存储 vector 元素 eque      更新时间:2023-10-16

相对于std::vectorstd::deque,"元素的连续存储位置"是什么意思?根据cplusplus.com,保证std::vector s(而std::deque s不)将元素存储在连续的存储位置。但是我如何在代码中看到它呢?它们都有一个随机访问迭代器所以在这两种情况下我们都可以给随机容器的引用添加一些随机偏移量这样就没问题了,对吧?

你可以通过使用vector::data()来看到这一点,它返回一个指向连续数据(http://www.cplusplus.com/reference/vector/vector/data/)。

然后,您可以使用基于指针的元素访问(尽管使用标准容器操作更安全,也更可行),例如,如果您想使用需要指针的函数,或者如果您认为它可以利用性能。

这个成员函数也适用于数组和字符串,因为它们也有连续的元素。

对于不保证连续性的容器,如deque、list或stack,该成员不存在。

您关心的原因是这个实现细节对性能产生了巨大的影响。您不需要通过尝试使用指针访问元素来证明这一点,因为您可以依靠它。Build 2014的一个演讲(如果你看不清整个过程,请跳到35分钟左右)展示了vector相对于其他数据结构的惊人性能提升,因为这种内存布局。

由于c++是标准化的,无论是库还是语言,您可以确定vector将始终为其元素使用连续内存,并且您可以指望您将获得的速度提升。这就是为什么vector应该始终是您的首选容器