755. std::vector and std:string lack explicit shrink-to-fit operations

Section: 26.3.11.3 [vector.capacity], 24.3.2.4 [string.capacity] Status: CD1 Submitter: Beman Dawes Opened: 2007-10-31 Last modified: 2016-02-10

Priority: Not Prioritized

View all other issues in [vector.capacity].

View all issues with CD1 status.

Discussion:

A std::vector can be shrunk-to-fit via the swap idiom:

vector<int> v;
...
v.swap(vector<int>(v));  // shrink to fit

or:

vector<int>(v).swap(v);  // shrink to fit

or:

swap(v, vector<int>(v));  // shrink to fit

A non-binding request for shrink-to-fit can be made to a std::string via:

string s;
...
s.reserve(0);

Neither of these is at all obvious to beginners, and even some experienced C++ programmers are not aware that shrink-to-fit is trivially available.

Lack of explicit functions to perform these commonly requested operations makes vector and string less usable for non-experts. Because the idioms are somewhat obscure, code readability is impaired. It is also unfortunate that two similar vector-like containers use different syntax for the same operation.

The proposed resolution addresses these concerns. The proposed function takes no arguments to keep the solution simple and focused.

Proposed resolution:

To Class template basic_string 24.3.2 [basic.string] synopsis, Class template vector 26.3.11 [vector] synopsis, and Class vector<bool> 26.3.12 [vector.bool] synopsis, add:

    
void shrink_to_fit();

To basic_string capacity 24.3.2.4 [string.capacity] and vector capacity 26.3.11.3 [vector.capacity], add:

void shrink_to_fit();

Remarks: shrink_to_fit is a non-binding request to reduce capacity() to size(). [Note: The request is non-binding to allow latitude for implementation-specific optimizations. — end note]

[ 850 has been added to deal with this issue with respect to deque. ]