std::basic_string<CharT,Traits,Allocator>::shrink_to_fit
From cppreference.com
< cpp | string | basic string
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
std::basic_string
Literals
Helper classes
Deduction guides (C++17)
(C++23)
(DR*)
(DR*)
(C++23)
(DR*)
(C++23)
(C++23)
basic_string::shrink_to_fit
(DR*)
(C++20)
(C++20)
(C++23)
(C++20)(C++20)
(until C++20)(until C++20)(until C++20)(until C++20)(until C++20)(C++20)
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++14)
(C++11)
void shrink_to_fit();
(constexpr since C++20)
Requests the removal of unused capacity.
It is a non-binding request to reduce capacity() to size() . It depends on the implementation if the request is fulfilled.
If (and only if) reallocation takes place, all pointers, references, and iterators are invalidated.
[edit] Complexity
Linear in the size of the string.
[edit] Notes
In libstdc++, shrink_to_fit()
is not available in C++98 mode.
[edit] Example
Run this code
#include <iostream> #include <string> int main() { std::string s; std::cout << "Size of std::string is " << sizeof s << " bytes\n" << "Default-constructed capacity is " << s.capacity() << " and size is " << s.size() << '\n'; for (int i = 0; i < 42; i++) s.append(" 42 "); std::cout << "Capacity after 42 appends is " << s.capacity() << " and size is " << s.size() << '\n'; s.clear(); std::cout << "Capacity after clear() is " << s.capacity() << " and size is " << s.size() << '\n'; s.shrink_to_fit(); std::cout << "Capacity after shrink_to_fit() is " << s.capacity() << " and size is " << s.size() << '\n'; }
Possible output:
GCC output: Size of std::string is 32 bytes Default-constructed capacity is 15 and size 0 Capacity after 42 appends is 240 and size 168 Capacity after clear() is 240 and size 0 Capacity after shrink_to_fit() is 15 and size 0 clang output (with -stdlib=libc++): Size of std::string is 24 bytes Default-constructed capacity is 22 and size is 0 Capacity after 42 appends is 191 and size is 168 Capacity after clear() is 191 and size is 0 Capacity after shrink_to_fit() is 22 and size is 0
[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 755 | C++98 | std::string lacked explicit shrink-to-fit operations
|
provided |
LWG 2223 | C++98 | 1. references, pointers, and iterators were not invalidated 2. there was no complexity requirement |
1. they may be invalidated 2. required to be linear |
[edit] See also
returns the number of characters that can be held in currently allocated storage
(public member function) [edit]
(public member function) [edit]