当预期数组时,将指针传递给向量中的第一个元素是否安全?

时间:2012-08-27 14:44:35

标签: c++ arrays stdvector

  

可能重复:
  Can I call functions that take an array/pointer argument using a std::vector instead?

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

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的实现? (也许这是一个操作员超载的东西?我对这些东西还不是那么自信......)

3 个答案:

答案 0 :(得分:9)

是的,这很安全。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

来自here

  

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

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