Espacios de nombres
Variantes

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

De cppreference.com

[edit template]
 
 
 
 
void shrink_to_fit();

Solicita la remoción de la capacidad sin usar.

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 se cumple la solicitud.

Se invalidan todos los iteradores y las referencias. También se invalida el iterador después del final.

Si T no es InsertablePorMovimiento en std::deque<T, Allocator>, el comportamiento no está definido.

(desde C++11)

Complejidad

A lo sumo lineal de acuerdo al tamaño del contenedor.

Exceptions

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

(desde C++11)

Notas

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


Ejemplo

#include <iostream>
#include <new>
#include <deque>

// asignador de memoria de C++11 mínimo con salida de depurador
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 << "asignar memoria para " << n << " bytes\n";
        return static_cast<Tp*>(::operator new(n));
    }
    void deallocate(Tp* p, std::size_t n) 
    {
        std::cout << "desasignar memoria para " << 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 no tiene una función capacity() (como std::vector),
     * es por esto que usamos un asignador personalizado para mostrar
     * el funcionamiento de shrink_to_fit.  */
    std::cout << "Construir deque por defecto:\n";
    std::deque<int, NAlloc<int>> deq;

    std::cout << "\nAgregar 300 elementos:\n";
    for (int i = 1000; i < 1300; ++i)
        deq.push_back(i);
    
    std::cout << "\Remueve 100 elementos al frente de la cola:\n";
    for (int i = 0; i < 100; ++i)
        deq.pop_front();

    std::cout << "\nEjecutar shrink_to_fit:\n";
    deq.shrink_to_fit();

    std::cout << "\nDestruye la cola al salir del ámbito:\n";
}

Posible salida:

Construir deque por defecto:
asignar memoria para 64 bytes
asignar memoria para 512 bytes

Agregar 300 elementos:
asignar memoria para 512 bytes
asignar memoria para 512 bytes

Remueve 100 elementos al frente de la cola:

Ejecutar shrink_to_fit:
asignar memoria para 64 bytes
asignar memoria para 512 bytes
asignar memoria para 512 bytes
desasignar memoria para 512 bytes
desasignar memoria para 512 bytes
desasignar memoria para 512 bytes
desasignar memoria para 64 bytes

Destruye la cola al salir del ámbito:
desasignar memoria para 512 bytes
desasignar memoria para 512 bytes
desasignar memoria para 64 bytes

Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 850 C++98 std::deque carecía de operaciones explícitas de reducción para ajustar. Se proporcionaron.
LWG 2033 C++98
C++11
1. Faltaba el requisito de complejidad (C++98)
2. No se requería que T fuera InsertablePorMovimiento (C++11)
1. Se agregó.
2. Se requiere.
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. Se agregó.

Véase también

Devuelve el número de elementos.
(función miembro pública) [editar]