&vec[0]是std::vector vec的定义行为吗?

8

我经常看到这样的情况:

std::vector<Something> vec;
do_something_with_vec(vec);
Something *arr=&vec[0];
do_something_that_needs_carray(arr);

我的意思是,向量可能会在内部使用数组,所以我明白为什么这能起作用,但我想知道这是否是定义良好的行为(换句话说,实现者是否允许使用此方法运行std :: vector的实现)。

如果标准之间存在冲突,我想知道C ++ 11标准是如何规定的。


1
不是“可能”,而是vector将使用连续的内存。 - John Dibling
1
如果标准之间存在冲突,我对C++11标准的规定很感兴趣。虽然C++98不能保证这将起作用,但C++03和C++11可以。 - ildjarn
3个回答

17

允许这样做,如果std::vector不为空。 如果vector为空,则vec[0]会引发未定义的行为。

std::vector需要按顺序存储元素。

还有data()方法,但仅适用于C++11。

重要提示:

这在std::vector<bool>(位效率专用化)上不起作用。 但它也不是一个容器,我认为它应该被弃用。


9

没问题。但如果vec为空,则行为未定义。最好使用vec.data(),即使vec为空也可以正常工作。


6

是的,这是可以的,因为元素被保证存储在连续的内存空间中。标准文件也承认了这一点:

向量的元素是按顺序存储的,也就是说,如果 v 是一个 vector<T, Allocator> 类型的变量,其中 T 是除 bool 以外的某种类型,则对于所有的 0 <= n < v.size(),都满足等式 &v[n] == &v[0] + n


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接