Namespaces
Variants

std::vector<T,Allocator>:: shrink_to_fit

From cppreference.net

void shrink_to_fit ( ) ;
(constexpr начиная с C++20)

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

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

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

Если T не является MoveInsertable в std:: vector < T, Allocator > , поведение не определено.

(начиная с C++11)

Содержание

Сложность

Не более чем линейно по размеру контейнера.

Исключения

Если исключение выбрасывается не конструктором перемещения не- CopyInsertable T , эффекты отсутствуют.

(since C++11)

Примечания

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

Пример

#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v;
    std::cout << "Default-constructed capacity is " << v.capacity() << '\n';
    v.resize(100);
    std::cout << "Capacity of a 100-element vector is " << v.capacity() << '\n';
    v.resize(50);
    std::cout << "Capacity after resize(50) is " << v.capacity() << '\n';
    v.shrink_to_fit();
    std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n';
    v.clear();
    std::cout << "Capacity after clear() is " << v.capacity() << '\n';
    v.shrink_to_fit();
    std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n';
    for (int i = 1000; i < 1300; ++i)
        v.push_back(i);
    std::cout << "Capacity after adding 300 elements is " << v.capacity() << '\n';
    v.shrink_to_fit();
    std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n';
}

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

Default-constructed capacity is 0
Capacity of a 100-element vector is 100
Capacity after resize(50) is 100
Capacity after shrink_to_fit() is 50
Capacity after clear() is 50
Capacity after shrink_to_fit() is 0
Capacity after adding 300 elements is 512
Capacity after shrink_to_fit() is 300

Отчеты о дефектах

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

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 755 C++98 std::vector не имел явных операций уменьшения до размера предоставлено
LWG 2033 C++98
C++11
1. отсутствовало требование к сложности (C++98)
2. T не требовалось быть MoveInsertable (C++11)
1. добавлено
2. требуется
LWG 2223 C++98
C++11
1. ссылки, указатели и итераторы не инвалидировались (C++98)
2. не было гарантии безопасности исключений (C++11)
1. они могут быть инвалидированы
2. добавлено

Смотрите также

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