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:
invalidates iterators , references @ or after point of erase, including
end()
iterator.
references , iterators erased elements invalidated. other references , iterators not affected.
all iterators , references invalidated, unless erased elements @ end or beginning of container, in case iterators , references erased elements invalidated.
Comments
Post a Comment