Мне было интересно, сможет ли кто-то более опытный выяснить, является ли это ошибкой в работе над вектором:
std::vector<int> v{1, 2, 3, 4, 5};
v.insert(v.begin() + 1, v[0]);
Я прошу, потому что элемент для вставки - это ссылка на 0-й элемент в векторе. Если вставка заставляет вектор изменять размер (поскольку его емкость заполнена), то ссылка на v[0]
будет признана недействительной, а код может вставить неправильное значение. Вот какой-то псевдокод, который может продемонстрировать:
template <typename T>
void vector_insert_method(Iterator pos, const T& value) {
if capacity full:
reallocate array and copy over element
// if value was reference to elem in this vector,
// that reference might be invalidated
insert element
++size
}
Эта проблема может быть более реалистичной в параллельной системе.
Аналогичный и связанный с этим вопрос - это то, что происходит, если вы попытаетесь вставить элемент, который появляется после позиции, которую вы пытаетесь вставить. Например, делая что-то вроде v.insert(v.begin(), v[2])
, потому что стандарт указывает, что ссылки на элементы после точки вставки недействительны. Гарантировано ли это?