Are std::vector elements guaranteed to be contiguous?

c++, language-lawyer, stdvector, vector

Solution

This was missed from C++98 standard proper but later added as part of a TR. The forthcoming C++0x standard will of course contain this as a requirement.

From n2798 (draft of C++0x):

23.2.6 Class template vector [vector]

1 A vector is a sequence container that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency. The elements of a vector are stored contiguously, meaning that if v is a vector where T is some type other than bool, then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().

Problem

My question is simple: are `std::vector` elements guaranteed to be contiguous? In other words, can I use the pointer to the first element of a `std::vector` as a C-array? If my memory serves me well, the C++ standard did not make such guarantee. However, the `std::vector` requirements were such that it was virtually impossible to meet them if the elements were not contiguous. Can somebody clarify this? Example: ``` std::vector<int> values; // ... fill up values if( !values.empty() ) { int *array = &values[0]; for( int i = 0; i < values.size(); ++i ) { int v = array[i]; // do something with 'v' } } ```

Original source

Related problems