std :: vector中的数据存储是否连续?

时间:2014-02-25 12:05:48

标签: c++ vector

我有一个字符向量,我想将它的内容作为char *传递给另一个函数:

void foo(boost::shared_ptr<std::vector<boost::uint8_t> > data)
{
    bar(data->size()?reinterpret_cast<char*>(&(data.get()->front())):NULL);
}

我可以假设数据总是以连续的方式存储吗? 感谢。

3 个答案:

答案 0 :(得分:6)

来自n2798(C ++ 0x草案)::

  

23.2.6类模板向量[向量]

     

1 vector是一个支持随机访问的序列容器   迭代器。另外,它支持(摊销)恒定时间插入   最后擦除操作;在中间插入和擦除   线性时间。虽然有提示,但会自动处理存储管理   可以提高效率。 向量的元素是   连续存储,意味着如果v是一个向量,其中T是一些   除bool以外的类型,然后它服从身份&amp; v [n] ==&amp; v [0] + n   对于所有0&lt; = n&lt; v.size()。

在向元素添加元素之后,还要重新分配检查数组(使任何指针和迭代器无效)。

另请查看此文章: - Cringe not: Vectors are guaranteed to be contiguous

  

contiguity实际上是向量抽象的一部分。就是这样   事实上,重要的是,当它被发现时,C ++ 98   标准并没有完全保证连续性,C ++ 03标准   修改后明确添加保证。

同样来自 C++ FAQ

#include <vector>
#include "Foo.h"  /* get class Foo */

// old-style code that wants an array
void f(Foo* array, unsigned numFoos);

void g()
{
  std::vector<Foo> v;
  ...
  f(v.empty() ? NULL : &v[0], v.size());  ← safe
}

如果v为空,滑稽的表达式v.empty() ? NULL : &v[0]只传递NULL指针,否则将指针传递给v的第一个(第0个)元素。如果你知道v不是空的先验,你可以改变它简单地说&amp; v [0]。 一般来说,这意味着您可以保证&v[0] + n == &v[n],其中v是std::vector<T>,n是0 .. v.size()-1.范围内的整数

但是v.begin()不能保证是T *,这意味着v.begin()不能保证与&amp; v [0]相同:

void g()
{
  std::vector<Foo> v;
  ...
  f(v.begin(), v.size());  ← Error!! Not Guaranteed!!
    ^^^^^^^^^-- cough, choke, gag; not guaranteed to be the same as &v[0]
}

答案 1 :(得分:2)

来自Cppreference

  

std :: vector是一个封装动态大小数组的序列容器。

     

元素是连续存储的,这意味着元素不仅可以通过迭代器访问,还可以使用常规指向元素的偏移量来访问。

所以是的,元素在内存中是连续的。这意味着您可以使用基础数据容器(使用T[]成员函数获得的data())作为经典数组。

答案 2 :(得分:0)

是的,你可以。该标准规定std::vector中的内存连续。但请注意,对于std::vector<bool>为真。

实际上std::vector::data()为您提供了指向向量中第一个元素的指针。然后,您可以使用指针算法来访问向量元素。