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

Cub*_*bic 8 c++ c++11

我看到了很多:

std::vector<Something> vec;
do_something_with_vec(vec);
Something *arr=&vec[0];
do_something_that_needs_carray(arr);
Run Code Online (Sandbox Code Playgroud)

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

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

mil*_*bug 17

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

std::vector 需要连续存储元素.

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

重要:

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


Joh*_*itb 9

那样就好.但如果vec是空的,那就是未定义的行为.更好的使用vec.data(),如果vec是空的,也可以工作.


Jos*_*eld 6

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

一个向量的元素被存储连续的,这意味着如果v是一个vector<T, Allocator>其中T一些类型比其它bool,那么它遵循身份&v[n] == &v[0] + n所有0 <= n < v.size().