Скажем, у меня есть этот код:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec {10, 15, 20};
auto itr = vec.begin();
vec.erase(itr);
for(const auto& element : vec)
{
std::cout << element << " ";
}
return 0;
}
Это дает мне 15 20
, как и ожидалось. Теперь cppreference говорит this о erase()
:
Недействительные итераторы и ссылки на или после точки erase, включая end() iterator
Достаточно справедливо, но единственная гарантия, которую дает стандарт vector::erase()
?
Является ли вектор разрешенным для его упорядочивания после стираемого итератора?
Например, гарантируются ли эти условия после стирания, что означало бы все элементы после того, как итератор erase()
сдвинулся 1 влево:
vec[0] == 15
vec[1] == 20
Или реализациям разрешено перемещать значения по мере их соответствия, и, таким образом, создавать сценарии, где vec[0] == 20
и т.д.
Мне нужна цитата из соответствующей части стандарта.