我有一个字符向量,我想将其内容作为 char* 传递给另一个函数:
void foo(boost::shared_ptr<std::vector<boost::uint8_t> > data)
{
bar(data->size()?reinterpret_cast<char*>(&(data.get()->front())):NULL);
}
我可以假设数据总是以连续的方式存储吗?
谢谢。
来自 n2798(C++0x 草案)::
23.2.6 类模板向量[向量]
1 向量是支持随机访问的序列容器
迭代器。此外,它还支持(摊销)恒定时间插入
并在最后进行擦除操作;在中间插入和删除
线性时间。存储管理是自动处理的,但有提示
可以给予提高效率。向量的元素是
连续存储,这意味着如果 v 是一个向量,其中 T 是某个向量
输入除 bool 之外的类型,则它遵循恒等式 &v[n] == &v[0] + n
对于所有 0
在向数组添加元素后,还要检查正在重新分配的数组(使任何指针和迭代器无效)。
另请查看这篇文章:-不要畏缩:向量保证是连续的
连续性实际上是矢量抽象的一部分。原来如此
事实上,重要的是,当人们发现 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.empty() ? NULL : &v[0]
如果 v 为空,则简单地传递 NULL 指针,否则传递指向 v 的第一个(第零个)元素的指针。如果您先验知道 v 不为空,则可以将其更改为简单的 &v[0]。
一般来说,这意味着您可以保证&v[0] + n == &v[n]
,其中 v 是std::vector<T>
n 是范围内的整数0 .. v.size()-1.
然而 v.begin() 不保证是 T*,这意味着 v.begin() 不保证与 &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]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)