Поведение перекрывающегося вектора :: вставка - PullRequest
3 голосов
/ 25 августа 2009

Где стандарт C ++ заявляет, что пара итераторов, переданных в std::vector::insert, не должна перекрывать исходную последовательность?

Редактировать: Чтобы уточнить, я почти уверен, что стандарт не требует стандартной библиотеки для обработки ситуаций, подобных этой:

std::vector<int> v(10);
std::vector<int>::iterator first = v.begin() + 5;
std::vector<int>::iterator last = v.begin() + 8;
v.insert(v.begin() + 2, first, last);

Однако в стандарте я не смог найти ничего, что запретило бы перекрытие диапазонов [first, last) и [v.begin(), v.end()).

Ответы [ 2 ]

7 голосов
/ 25 августа 2009

23.1.1 / 4 Требования к последовательности имеют:

выражение: a.insert (p, i, j)

тип возврата: void

предварительное условие: i, j не являются итераторами в . вставляет копии элементов в [i, j) перед p.

Так что i и j не могут быть итераторами в вашем векторе.

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

3 голосов
/ 25 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...