Neil Kirk Neil Kirk - 1 month ago 4x
C++ Question

What does the standard say about how calling clear on a vector changes the capacity?

This website implies that clearing a vector MAY change the capacity:

Many implementations will not release allocated memory after a call
to clear(), effectively leaving the capacity() of the vector

But according to @JamesKanze this is wrong and the standard mandates that clear will not change capacity.

What does the standard say?


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) {
assert(v.capacity() >= 5);
assert(v.capacity() >= 5);
std::vector<int>::iterator i = v.begin() + 1;
*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.)