将矢量作为数组传递是否安全?

时间:2010-06-22 13:19:05

标签: c++ arrays stl vector

说我有一个功能:

void someFunc(int *x,int count);

这是我无法控制的,所以我不能把它写成接受迭代器。

如此调用它是否安全(无论具体的STL实现如何):

vector<int> v;
/* ... */
someFunc(&v[0],v.size());

显然,一个反例是vector<bool>。其他类型怎么样? (假设我没有以任何方式专门vector)。

3 个答案:

答案 0 :(得分:31)

从第23.2.4节,标准第1点开始:

  

[...]向量的元素是连续存储的,   这意味着如果v是一个向量,其中T是某种类型而不是bool,那么它服从所有0&lt; = n&lt;&lt; = n&lt;&lt; = n&lt;&lt; = n&lt; v.size()。

是的,这是安全的。

注意:如果v为空v[0]是未定义的行为,那么只有当v 为空时才应执行此操作

答案 1 :(得分:9)

正如其他人所说,它是安全的。

但我想要一个小预订。 如果此函数接受数组并将其存储以供以后使用,则可能存在问题。 这是因为如果需要它来改变大小,std :: vector可以自由地释放它的内存。因此,如果此函数只使用数组(复制或其他)或您永远不会改变它,那么它是安全的。

我只想指出这一点,仅仅因为矢量元素是连续存储的,所以传递它并不是自动安全的。所有权仍然是一个问题。

答案 2 :(得分:8)

是。假设v.size() > 0,这是安全的(如果向量为空,则v[0]会导致未定义的行为)。

std::vector容器的元素是连续存储的,就像在普通数组中一样。