C++ 当需要数组时,传递指向向量中第一个元素的指针是否安全?

C++ 当需要数组时,传递指向向量中第一个元素的指针是否安全?,c++,arrays,stdvector,C++,Arrays,Stdvector,可能重复: 我最近遇到了这样的事情: 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::向量条; 杆。推回(42); // ... X; x、 foo

可能重复:

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

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::向量条;
杆。推回(42);
// ...
X;
x、 foo(&bar[0],(int)bar.size();
现在我想知道这是一种安全的方法,还是恰好适用于大多数
std::vector
的实现?(也许这是一个操作员过载的问题?我对这个东西还没有信心。)

是的,它是安全的

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

向量是支持随机访问迭代器的序列容器。此外,它还支持(摊销) 在末尾执行固定时间插入和擦除操作;插入和擦除在中间取线性时间。存储 管理是自动处理的,尽管可以给出提示以提高效率一个元素的元素 向量是连续存储的,这意味着如果v是一个向量,T是另一种类型


然后它服从身份&v[n]=&v[0]+n对于所有的0是的,它是允许的,并且将像永远指出的那样工作。但是,只有在注意不要删除向量并在数组中留下悬空指针的情况下,它才是安全的。由于您在阵列和向量之间共享内存,因此由您管理该内存。

来自:

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


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

注意,现在它有一个用于此目的的
data()
函数。任何序列容器的元素都是“按照严格的线性序列排序”,但这并不意味着它们存储在一个连续的数组中。链接的第二段更相关:“向量容器的元素存储在连续的存储位置”。事实上,这也适用于
std::list
,其中元素不连续。