元素在 std::vector 和 std::d eque 中的连续存储位置
Elements' contiguous storage locations in std::vector and std::deque
相对于std::vector
和std::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
应该始终是您的首选容器
相关文章:
- std::stack 是连续的吗?
- 是否确保 2 个连续的 std::chrono::steady_clock::now() 不相等?
- std::set 是否将对象连续存储在内存中?
- vector是否为std::移动的对象连续分配内存
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- std::array与C样式数组用于连续内存
- 比较两个std::矢量/阵列,或者通常比较两个stl连续器
- 从 std::string 中删除特定的连续字符重复
- C++ 如何在 std::vector 中插入一个连续的间隔范围?
- 连续使用 std::list 会导致崩溃
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- std::vector 如何支持未知大小的自定义对象的连续内存
- std::没有等价关系的唯一示例(删除连续空格)
- 是否有任何方法可以比较C 中的STD ::的两个连续元素
- 从带有位偏移量的std::字符串中按字节提取连续位
- std::vector 的连续内存分配
- std::vector中的数据存储是否连续
- std::list c++是连续的,那么在序列中的任何位置插入和擦除操作都需要恒定的时间
- 为什么 std::vector 是连续的
- std::bitset 是否保证连续内存以及结构中的恒定大小(以避免填充?