Namespaces
Variants

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

From cppreference.net

void shrink_to_fit ( ) ;
(constexpr desde C++26)

Solicita la eliminación de capacidad no utilizada.

Es una solicitud no vinculante para reducir el uso de memoria sin cambiar el tamaño de la secuencia. Depende de la implementación si la solicitud se cumple.

Todos los iteradores (incluyendo el end() iterator) y todas las referencias a los elementos quedan invalidados.

Si T no es MoveInsertable en std:: deque < T, Allocator > , el comportamiento es indefinido.

(desde C++11)

Contenidos

Complejidad

Como máximo lineal en el tamaño del contenedor.

Excepciones

Si se lanza una excepción que no sea por el constructor de movimiento de un CopyInsertable T no, no hay efectos.

(desde C++11)

Notas

En libstdc++, shrink_to_fit() está no disponible en modo C++98.

Ejemplo

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

Salida posible:

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 850 C++98 std::deque carecía de operaciones explícitas de reducción de capacidad proporcionado
LWG 2033 C++98
C++11
1. faltaba el requisito de complejidad (C++98)
2. T no se requería que fuera MoveInsertable (C++11)
1. añadido
2. requerido
LWG 2223 C++98
C++11
1. las referencias, punteros e iteradores no se invalidaban (C++98)
2. no había garantía de seguridad de excepciones (C++11)
1. pueden invalidarse
2. añadida

Véase también

devuelve el número de elementos
(función miembro pública)