Добавление std::vector к себе, поведение undefined?

Этот вопрос заставил меня не сомневаться в добавлении вектора к себе. Итак, вопрос в следующем: следующие строки кода делают то, что я ожидаю, но стандартно ли это соответствует?

vec.reserve(vec.size() * 2):
vec.insert(vec.end(), vec.begin(), vec.end());

Продолжается (без reserve()), даже стандартно ли это соответствует?

vec.insert(vec.end(), vec.begin(), vec.end());

Или реализация зависит?

Ответ 1

В соответствии со спецификацией ISO С++ 03 (см. раздел 23.1.1, таблица 67) (и как @AndyProwl упомянул в таблице 11.2.3 таблицы 11 спецификации С++ 11 ISO), поскольку часть требований последовательности, операция a.insert(p, i, j) в контейнере последовательности имеет это предварительное условие:

i, j не являются итераторами в a.

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

В результате, если вы попытаетесь вставить элементы контейнера в себя, вы вызываете стандартную библиотечную функцию и нарушаете предварительное условие. Это приводит к поведению undefined, что означает, что он может работать на некоторых платформах, если разработчики библиотеки - хорошие люди, но это может ужасно и катастрофически потерпеть неудачу без каких-либо оправданий.

Надеюсь, это поможет!