Depending on the version of the standard you are looking at,
clear
is defined as the equivalent of erase(begin(), end())
, or (in C++11):
"Destroys all elements in a. Invalidates all
references, pointers, and iterators referring to
the elements of a and may invalidate the
past-the-end iterator."
In neither case is it allowed to modify
the capacity; the following code is guaranteed safe by the
standard:
std::vector<int> v;
for (int i = 0; i != 5; ++ i) {
v.push_back(i);
}
assert(v.capacity() >= 5);
v.clear();
assert(v.capacity() >= 5);
v.push_back(10);
v.push_back(11);
std::vector<int>::iterator i = v.begin() + 1;
v.push_back(12);
v.push_back(13);
*i = 42; // i must still be valid, because none of
// the push_back would have required an
// increase of capacity
(The reason for the change in wording in C++11: the committee
didn't want to require MoveAssignable
for clear
, which would
have been the case if it were defined in terms of erase
.)
clear
: "...and the vector capacity is not guaranteed to change" which I interpreted as: It might change but there is no guarantee that it does change. – Spectatress