Указатель становится недействительным, если итератор недействителен в контейнерах STL

Я пытаюсь понять концепцию аннулирования итератора в векторах.
Из некоторых прочитанных мною чтений я обнаружил, что если вектор содержит, скажем, 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

Я удивлен, почему вектор не упомянул, что итератор недействителен, поскольку это был итератор, полученный до удаления элемента.

1

Решение

Различные контейнеры ведут себя по-разному при удалении элемента.

От http://en.cppreference.com:

std::vector::erase

Делает недействительными итераторы и ссылки в или после точки удаления, включая end() итератор.

std::map::erase

Ссылки и итераторы на стертые элементы становятся недействительными. Другие ссылки и итераторы не затрагиваются.

std::deque::erase

Все итераторы и ссылки становятся недействительными, если только стертые элементы не находятся в конце или начале контейнера, и в этом случае недопустимы только итераторы и ссылки на стертые элементы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]