我有一个字符向量,我想将它的内容作为char *传递给另一个函数:
void foo(boost::shared_ptr<std::vector<boost::uint8_t> > data)
{
bar(data->size()?reinterpret_cast<char*>(&(data.get()->front())):NULL);
}
我可以假设数据总是以连续的方式存储吗? 感谢。
答案 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()
为您提供了指向向量中第一个元素的指针。然后,您可以使用指针算法来访问向量元素。