c++ - Does a pointer become invalidated if an iterator is invalidated in STL containers -


i trying understand concept of iterator invalidation in vectors. of reading have done have found if vector contains 7 elements , delete element on 5th index iterators 5th element onwards become invalidated. because elements after 5th index need move 1 slot. makes sense me bit confused between following 2 cases

    std::vector<foo> vec {foo{1},foo{2}};              //foo simple class     foo* ptr = &vec[0];                                //case 1     std::vector<foo>::iterator = vec.begin() + 1;   //case 2 

is safe stl container if iterator becomes invalidated pointer becomes invalidated ? instance if it becomes invalidated ptr invalid ? if not give case in iterator becomes invalidated pointer remains valid ? interested in vectors , maps , deques.

update: wrote little code , experimented

std::vector<foo> vec {foo{1},foo{2},foo{3}}; foo* ptr = &vec[1]; std::vector<foo>::iterator = vec.begin() + 1; std::cout << "before : " <<  ptr->a << "\n"; vec.erase(vec.begin() + 1); //remove second element std::cout << "iterator value : " << it->a << "\n"; std::cout << "after : " <<  ptr->a << "\n"; 

the result

before : 2 iterator value : 3 after : 3 

i surprised why vector did not mention iterator invalid since iterator obtained before element removed.

different containers behave differently when remove item.

from http://en.cppreference.com:

std::vector::erase

invalidates iterators , references @ or after point of erase, including end() iterator.

std::map::erase

references , iterators erased elements invalidated. other references , iterators not affected.

std::deque::erase

all iterators , references invalidated, unless erased elements @ end or beginning of container, in case iterators , references erased elements invalidated.


Comments