2

可能重复:
我可以使用 std::vector 来调用采用数组/指针参数的函数吗?

我最近遇到了这样的事情:

class X {
    public: void foo(float* p, int elements);
};

= 一个需要浮点值数组的方法。

但在示例代码中,这是他们使用它的方式:

std::vector<float> bar;
bar.push_back(42);
// ...

X x;
x.foo( &bar[0], (int)bar.size() );

现在我想知道这是一种安全的方法还是恰好适用于大多数实现std::vector?(也许这是一个运算符重载的事情?我对这些东西还没有那么自信..)

4

3 回答 3

9

是的,它是安全的。

n3337 23.3.6.1/1。在 C++03 标准中,这是 23.2.4/1

向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销)恒定时间的最后插入和擦除操作;在中间插入和擦除需要线性时间。存储管理是自动处理的,但可以给出提示以提高效率。向量的元素是连续存储的,这意味着如果 v 是一个向量,其中 T 是 bool 以外的某种类型,那么对于所有 0 <= n < v,它都遵循恒等式 &v[n] == &v[0] + n 。尺寸()​​。

于 2012-08-27T14:46:48.123 回答
0

是的,这是允许的,并且会像 Forever 指出的那样工作。但是,只有当您注意不要删除向量并在数组中留下悬空指针时,它才是安全的。由于您在数组和向量之间共享内存,因此由您来管理该内存。

于 2012-08-27T14:49:54.733 回答
-1

这里

因此,它们的元素按照严格的线性顺序排列

使用该定义和元素访问运算符([]),然后表达式&avector[0]获取第一个元素的地址,下一个元素是它之后的连续序列。

于 2012-08-27T14:50:36.153 回答