Spec-Zone.ru › C++

std::basic_string<CharT,Traits,Allocator>::shrink_to_fit

void shrink_to_fit();
(constexpr с C++20)

Запрашивает удаление неиспользуемой ёмкости.

Это необязательный запрос на уменьшение capacity() до size(). Выполнение запроса зависит от реализации.

Если (и только если) происходит перераспределение памяти, все указатели, ссылки и итераторы становятся недействительными.

Сложность

Линейная относительно размера строки.

Примечания

В libstdc++ shrink_to_fit() недоступен в режиме C++98.

Пример

#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';
}

Возможный вывод:

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

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Поведение согласно опубликованной версии Корректное поведение
LWG 755 C++98 std::string не имел явных операций сокращения до требуемого размера добавлены
LWG 2223 C++98 1. ссылки, указатели и итераторы не становились недействительными
2. требования к сложности отсутствовали
1. они могут стать недействительными
2. требуется линейная сложность

См. также

sizelength
возвращает количество символов
(открытая функция-член)
capacity
возвращает количество символов, которое может храниться в выделенной в данный момент памяти
(открытая функция-член)
resize
изменяет количество хранящихся символов
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/basic_string/shrink_to_fit

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API