Namespaces
Variants

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

From cppreference.net

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

Demande la suppression de la capacité inutilisée.

Il s'agit d'une demande non contraignante pour réduire l'utilisation de la mémoire sans modifier la taille de la séquence. La mise en œuvre de cette demande dépend de l'implémentation.

Tous les itérateurs (y compris l'itérateur end() ) et toutes les références aux éléments sont invalidés.

Si T n'est pas MoveInsertable dans std:: deque < T, Allocator > , le comportement est indéfini.

(depuis C++11)

Table des matières

Complexité

Au plus linéaire par rapport à la taille du conteneur.

Exceptions

Si une exception est levée autre que par le constructeur de déplacement d'un CopyInsertable T non-, il n'y a aucun effet.

(depuis C++11)

Notes

Dans libstdc++, shrink_to_fit() n'est pas disponible en mode C++98.

Exemple

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

Sortie possible :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR S'applique à Comportement publié Comportement corrigé
LWG 850 C++98 std::deque manquait d'opérations explicites de réduction de capacité fourni
LWG 2033 C++98
C++11
1. l'exigence de complexité était manquante (C++98)
2. T n'était pas requis d'être MoveInsertable (C++11)
1. ajoutée
2. requis
LWG 2223 C++98
C++11
1. les références, pointeurs et itérateurs n'étaient pas invalidés (C++98)
2. il n'y avait pas de garantie de sécurité d'exception (C++11)
1. ils peuvent être invalidés
2. ajoutée

Voir aussi

retourne le nombre d'éléments
(fonction membre publique)