Я пытаюсь понять концепцию аннулирования итератора в векторах.
Из некоторых прочитанных мною чтений я обнаружил, что если вектор содержит, скажем, 7 элементов, и вы удаляете элемент 5-го индекса, то итераторы 5-го элемента и далее становятся недействительными. Это потому, что все элементы после 5-го индекса должны были бы сдвинуться вверх на один слот. Это имеет смысл для меня, однако я немного запутался в следующих двух случаях
std::vector<foo> vec {foo{1},foo{2}}; //foo is a simple class
foo* ptr = &vec[0]; //Case 1
std::vector<foo>::iterator it = vec.begin() + 1; //Case 2
Можно ли с уверенностью сказать, что для контейнера STL, если итератор становится недействительным, указатель также становится недействительным? Например, если it
становится недействительным будет ptr
быть недействительным тоже? Если нет, не могли бы вы привести случай, когда итератор становится недействительным, а указатель остается действительным? Я в настоящее время интересуюсь векторами, картами и deques.
Обновить:
Поэтому я написал немного кода и экспериментировал
std::vector<foo> vec {foo{1},foo{2},foo{3}};
foo* ptr = &vec[1];
std::vector<foo>::iterator it = vec.begin() + 1;
std::cout << "Before : " << ptr->a << "\n";
vec.erase(vec.begin() + 1); //Remove the second element
std::cout << "Iterator value : " << it->a << "\n";
std::cout << "After : " << ptr->a << "\n";
Результат был
Before : 2
Iterator value : 3
After : 3
Я удивлен, почему вектор не упомянул, что итератор недействителен, поскольку это был итератор, полученный до удаления элемента.
Различные контейнеры ведут себя по-разному при удалении элемента.
От http://en.cppreference.com:
Делает недействительными итераторы и ссылки в или после точки удаления, включая
end()
итератор.
Ссылки и итераторы на стертые элементы становятся недействительными. Другие ссылки и итераторы не затрагиваются.
Все итераторы и ссылки становятся недействительными, если только стертые элементы не находятся в конце или начале контейнера, и в этом случае недопустимы только итераторы и ссылки на стертые элементы.
Других решений пока нет …