标准向量+默认分配器+直接数组访问?
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】:是的,向量的设计让你可以做到这一点,使用&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/… 这是同一问题的另一个有用答案以上是关于标准向量+默认分配器+直接数组访问?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法直接在堆上分配一个标准的 Rust 数组,完全跳过堆栈?
为啥 C++ 标准向量在分配或调整大小时会出现段错误? [关闭]