Является ли он переносимым для обработки массива std::vector

Я видел, как люди в моей команде пишут такой код. Я лично считаю, что это не переносится, поскольку вектор может быть реализован совершенно по-другому. Я прав?

vector<int> a;
a.push_back(1);
a.push_back(2);
a.push_back(3);

int* b = &a[0];
std::cout<< *(b +1); // this will print 2

Ответ 1

Этот код правильный. Элементы, хранящиеся в std::vector, гарантированно сохраняются вместе с С++ 03.

Это соответствующая часть текущего стандартного проекта С++ N3797 (23.3.6.1):

Вектор представляет собой контейнер последовательности, который поддерживает произвольный доступ итераторы. Кроме того, он поддерживает (амортизированную) постоянную временную вставку и операции стирания в конце; вставлять и стирать посередине линейное время. Управление хранилищем обрабатывается автоматически, хотя подсказки может быть дано для повышения эффективности. Элементы вектора сохраненный смежно, что означает, что если v - вектор, где T - некоторый тип, отличный от bool, тогда он подчиняется идентификатору &v[n] == &v[0] + nдля всех 0 <= n < v.size().

Ответ 2

Как бы ни был реализован вектор, некоторые вещи гарантируются стандартом, чтобы оставаться последовательным. A std::vector всегда хранится смежно в памяти, и поэтому он может работать с итераторами произвольного доступа.