说我有一个功能:
void someFunc(int *x,int count);
这是我无法控制的,所以我不能把它写成接受迭代器。
如此调用它是否安全(无论具体的STL实现如何):
vector<int> v;
/* ... */
someFunc(&v[0],v.size());
显然,一个反例是vector<bool>
。其他类型怎么样? (假设我没有以任何方式专门vector
)。
答案 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
容器的元素是连续存储的,就像在普通数组中一样。