Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | container‎ | deque
 
 
 
 
void shrink_to_fit();

Fordert die Entfernung von ungenutztem Speicherplatz an.

Es ist eine unverbindliche Anforderung, den Speicherverbrauch zu reduzieren, ohne die Größe der Sequenz zu ändern. Ob die Anforderung erfüllt wird, hängt von der Implementierung ab.

Alle Iteratoren (einschließlich des end()-Iterators) und alle Referenzen auf die Elemente werden ungültig.

Wenn T nicht MoveInsertable in std::deque<T, Allocator> ist, ist das Verhalten undefiniert.

(seit C++11)

Inhalt

[bearbeiten] Komplexität

Höchstens linear zur Größe des Containers.

Ausnahmen

Wenn eine Ausnahme geworfen wird, die nicht vom Move-Konstruktor eines nicht CopyInsertable T stammt, hat dies keine Auswirkungen.

(seit C++11)

[bearbeiten] Anmerkungen

In libstdc++ ist shrink_to_fit() im C++98-Modus nicht verfügbar.

[bearbeiten] Beispiel

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

Mögliche Ausgabe

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

[bearbeiten] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 850 C++98 std::deque fehlten explizite shrink-to-fit-Operationen bereitgestellt
LWG 2033 C++98
C++11
1. Die Anforderung an die Komplexität fehlte (C++98)
2. T musste nicht MoveInsertable sein (C++11)
1. hinzugefügt
2. gefordert
LWG 2223 C++98
C++11
1. Referenzen, Zeiger und Iteratoren wurden nicht ungültig gemacht (C++98)
2. Es gab keine Ausnahme-Sicherheitsgarantie (C++11)
1. Sie können ungültig gemacht werden
2. hinzugefügt

[bearbeiten] Siehe auch

Gibt die Anzahl der Elemente zurück
(public member function) [edit]