Мой вопрос прост: гарантированно ли элементы std :: vector смежны? В порядке слов, могу ли я использовать указатель на первый элемент std :: vector как C-массив?
Если мне не изменяет память, стандарт C ++ не давал такой гарантии. Однако требования std :: vector были таковы, что их было практически невозможно удовлетворить, если элементы не были смежными.
Может кто-нибудь прояснить это?
Пример:
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'
}
}
values
, которые изменяют, в частности, которые изменяют его размер (например, push_back()
), могут вызвать перераспределение базового вектора, что делает недействительным указатель, скопированный в array
. Тот же принцип лежит в основе использования vector :: iterator вместо указателя на вектор. :)
values
внутри этогоif
блока. Однако я не знаю ответа на ваш вопрос, поэтому просто оставляю комментарий. :)