标准向量+默认分配器+直接数组访问?

Posted

技术标签:

【中文标题】标准向量+默认分配器+直接数组访问?【英文标题】:std vector + default allocator + direct array access? 【发布时间】:2009-11-20 02:18:53 【问题描述】:

如果我使用这样的默认分配器创建 std::vector:

vector<int> myVec = vector<int>();
myVec.push_back(3);
myVec.push_back(5);
myVec.push_back(8);

然后向量是否将实际数据在内部存储到 int 数组中?是否可以获取指向该数组的指针并使用该指针直接对其进行迭代?

【问题讨论】:

【参考方案1】:

是的,向量的设计让你可以做到这一点,使用&amp;myVec[0] 来获得int*。您还可以使用 vector 的迭代器类型,其行为类似。 (指针是有效的随机访问迭代器。)您使用默认分配器或任何其他分配器不会改变任何这些,它是向量接口的必需部分。

向量是guaranteed 以使用连续存储。特别是从众多结果中,请查看 Stroustrup 本人的this one。

【讨论】:

唯一需要注意的是,如果您添加或删除元素,您可能会导致重新分配,这可能会在内存中移动向量。【参考方案2】:

对于gcc 4.4,此运算符定义为:

operator[](size_type __n)
 return *(this->_M_impl._M_start + __n); 

所以,我们可以说项目存储为常规数组,您可以直接访问它们

已编辑

【讨论】:

不是我的反对意见,但我确实在回答中添加了最后一段作为回应——您可以直接访问它。 是的,你可以访问它_M_impl._M_start应该指向它。 ***.com/questions/849168/… 这是同一问题的另一个有用答案

以上是关于标准向量+默认分配器+直接数组访问?的主要内容,如果未能解决你的问题,请参考以下文章

动态分配 SIMD 向量数组是不是安全?

标准模板库中的向量(vector)

有没有办法直接在堆上分配一个标准的 Rust 数组,完全跳过堆栈?

为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]

分配了矩阵列标准差的向量正在改变其值 (RcppArmadillo)

面试中常被问到STL标准库容器分类