& vec [0]是否为std :: vector vec定义了行为?

时间:2012-12-21 19:52:09

标签: c++ c++11

我看到了很多:

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

我的意思是,一个向量可能会在内部使用一个数组,所以我明白为什么这个工作,我只是想知道这是否是定义的行为(比如,是一个允许运行std :: vector的实现的实现者)这会破坏。

如果标准之间存在冲突,我对C ++ 11标准所说的内容感兴趣。

3 个答案:

答案 0 :(得分:17)

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

std::vector是连续存储元素所必需的。

还有data()方法,但它只是C ++ 11。

重要的:

这不适用于std::vector<bool>(比特效率专门化)。但它也不是容器,IMO应该被弃用。

答案 1 :(得分:9)

没关系。但是如果vec为空,则它是未定义的行为。如果vec.data()为空,最好使用vec

答案 2 :(得分:6)

是的,这很好,因为保证元素是连续存储的。标准承认这一点:

  

向量的元素是连续存储的,这意味着如果vvector<T, Allocator>,其中T是除bool以外的某种类型,那么它就服从&v[n] == &v[0] + n {1}}适用于所有0 <= n < v.size()