简体   繁体   中英

Does std::vector::erase() invalidate the iterator at the point of erase?

C++03 Standard § 23.2.4.3/3 describes std::vector::erase(iterator position) and says specifically

Invalidates all the iterators and references after the point of the erase.

Is the iterator at the point of the erase not invalidated? Specifically if I have a vector with a single element and I copy begin() iterator into a local variable and then call

vec.erase(vec.begin())

Will that iterator I have in a local variable get invalidated or not?

Will the iterators be invalidated after the point of erasure or after and including the point of erasure?

I'd say that your example with erasing the only element in the vector shows that the iterator at the insertion point must be invalidated.

Anyway, in C++11, the wording has been changed (23.3.6.5/3):

Effects: Invalidates iterators and references at or after the point of the erase.

The complexity of vector::erase() says: Linear on the number of elements erased (destructions) plus the number of elements after the last element deleted (moving).

It seems to me that it is implemented as a lazy grow/shrink array. The iterator, a pointer to the data, when erased, the following data will copied into its place. And thus the iterator you keep, will point to some data else, provided that the data you erase is not the last one.

In fact, it may depend on implementation. Yet I think a lazy grow/shrink array is the best-fit implementation for vector::erase() . [Since it may depends on implementation, don't count on anything like invalidate...]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM