std::deque<T,Allocator>:: shrink_to_fit
|
void
shrink_to_fit
(
)
;
|
(constexpr начиная с C++26) | |
Запрашивает удаление неиспользуемой ёмкости.
Это необязательный запрос на сокращение использования памяти без изменения размера последовательности. Зависит от реализации, будет ли запрос выполнен.
Все итераторы (включая
end()
итератор) и все ссылки на элементы становятся недействительными.
|
Если
|
(since C++11) |
Содержание |
Сложность
Не более чем линейно по размеру контейнера.
Исключения
Если исключение выбрасывается не конструктором перемещения не-
CopyInsertable
|
(since C++11) |
Примечания
В libstdc++,
shrink_to_fit()
недоступен
в режиме C++98.
Пример
#include <cstddef> #include <deque> #include <iostream> #include <new> // Minimal C++11 allocator with debug output. template<class Tp> struct NAlloc { typedef Tp value_type; NAlloc() = default; template<class T> NAlloc(const NAlloc<T>&) {} Tp* allocate(std::size_t n) { n *= sizeof(Tp); std::cout << "allocating " << n << " bytes\n"; return static_cast<Tp*>(::operator new(n)); } void deallocate(Tp* p, std::size_t n) { std::cout << "deallocating " << n*sizeof*p << " bytes\n"; ::operator delete(p); } }; template<class T, class U> bool operator==(const NAlloc<T>&, const NAlloc<U>&) { return true; } template<class T, class U> bool operator!=(const NAlloc<T>&, const NAlloc<U>&) { return false; } int main() { // std::queue has no capacity() function (like std::vector). // Because of this, we use a custom allocator to show the // working of shrink_to_fit. std::cout << "Default-construct deque:\n"; std::deque<int, NAlloc<int>> deq; std::cout << "\nAdd 300 elements:\n"; for (int i = 1000; i < 1300; ++i) deq.push_back(i); std::cout << "\nPop 100 elements:\n"; for (int i = 0; i < 100; ++i) deq.pop_front(); std::cout << "\nRun shrink_to_fit:\n"; deq.shrink_to_fit(); std::cout << "\nDestroy deque as it goes out of scope:\n"; }
Возможный вывод:
Default-construct deque: allocating 64 bytes allocating 512 bytes Add 300 elements: allocating 512 bytes allocating 512 bytes Pop 100 elements: Run shrink_to_fit: allocating 64 bytes allocating 512 bytes allocating 512 bytes deallocating 512 bytes deallocating 512 bytes deallocating 512 bytes deallocating 64 bytes Destroy deque as it goes out of scope: deallocating 512 bytes deallocating 512 bytes deallocating 64 bytes
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 850 | C++98 |
std::deque
lacked explicit shrink-to-fit operations
|
provided |
| LWG 2033 |
C++98
C++11 |
1. the complexity requirement was missing (C++98)
2.
T
was not required to be
MoveInsertable
(C++11)
|
1. added
2. required |
| LWG 2223 |
C++98
C++11 |
1. references, pointers, and iterators were not invalidated (C++98)
2. there was no exception safety guarantee (C++11) |
1. they may be invalidated
2. added |
Смотрите также
|
возвращает количество элементов
(публичная функция-член) |