【发布时间】: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 数组中?是否可以获取指向该数组的指针并使用该指针直接对其进行迭代?
【问题讨论】:
如果我使用这样的默认分配器创建 std::vector:
vector<int> myVec = vector<int>();
myVec.push_back(3);
myVec.push_back(5);
myVec.push_back(8);
然后向量是否将实际数据在内部存储到 int 数组中?是否可以获取指向该数组的指针并使用该指针直接对其进行迭代?
【问题讨论】:
是的,向量的设计让你可以做到这一点,使用&myVec[0] 来获得int*。您还可以使用 vector 的迭代器类型,其行为类似。 (指针是有效的随机访问迭代器。)您使用默认分配器或任何其他分配器不会改变任何这些,它是向量接口的必需部分。
向量是guaranteed 以使用连续存储。特别是从众多结果中,请查看 Stroustrup 本人的this one。
【讨论】:
对于gcc 4.4,此运算符定义为:
operator[](size_type __n)
{ return *(this->_M_impl._M_start + __n); }
所以,我们可以说项目存储为常规数组,您可以直接访问它们
已编辑
【讨论】:
_M_impl._M_start应该指向它。 stackoverflow.com/questions/849168/… 这是同一问题的另一个有用答案