Spec-Zone.ru › C++

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

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

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

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

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

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

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

Сложность

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

Исключения

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

(начиная с 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. добавлена

См. также

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

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

Spec-Zone.ru

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