std::vector<T,Allocator>:: shrink_to_fit
|
void
shrink_to_fit
(
)
;
|
(constexpr начиная с C++20) | |
Запрашивает удаление неиспользуемой ёмкости.
Это необязательный запрос на уменьшение capacity() до size() . Зависит от реализации, будет ли запрос выполнен.
Если происходит перераспределение памяти, все итераторы (включая итератор
end()
) и все ссылки на элементы становятся недействительными. Если перераспределение памяти не происходит, никакие итераторы или ссылки не инвалидируются.
|
Если
|
(начиная с C++11) |
Содержание |
Сложность
Не более чем линейно по размеру контейнера.
Исключения
Если исключение выбрасывается не конструктором перемещения не-
CopyInsertable
|
(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. добавлено |
Смотрите также
|
возвращает количество элементов
(публичная функция-член) |
|
|
возвращает количество элементов, которое может содержаться в выделенной в данный момент памяти
(публичная функция-член) |