我有一个字符向量,我想将它的内容作为char*传递给另一个函数:
void foo(boost::shared_ptr<std::vector<boost::uint8_t> > data)
{
bar(data->size()?reinterpret_cast<char*>(&(data.get()->front())):NULL);
}
Run Code Online (Sandbox Code Playgroud)
我可以假设数据总是以连续的方式存储吗?谢谢.
来自n2798(C++ 0x草案)::
23.2.6类模板向量[向量]
1 vector是一个支持随机访问迭代器的序列容器.此外,它支持(摊销)最后的恒定时间插入和擦除操作; 在中间插入和擦除需要线性时间.存储管理是自动处理的,但可以提供提示以提高效率.向量的元素是连续存储的,这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0 <= n <v的身份&v [n] ==&v [0] + n .尺寸().
在向元素添加元素之后,还要重新分配检查数组(使任何指针和迭代器无效).
另请查看这篇文章: - 不要畏惧:向量保证是连续的
连续性实际上是向量抽象的一部分.事实上,当发现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
}
Run Code Online (Sandbox Code Playgroud)
v.empty() ? NULL : &v[0]如果v为空,则滑动表达式只传递NULL指针,否则将指针传递给v的第一个(第0个)元素.如果您知道v不是空的先验,则可以将其更改为&v [0].一般来说,这意味着你可以保证&v[0] + n == &v[n],其中v是a 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]
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1507 次 |
| 最近记录: |