Namensräume
Varianten
Aktionen

std::basic_string<CharT,Traits,Allocator>::reserve

Von cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
(1)
void reserve( size_type new_cap = 0 );
(bis C++20)
constexpr void reserve( size_type new_cap );
(seit C++20)
void reserve();
(2) (seit C++20)
(veraltet in C++20)
(entfernt in C++26)
1) Informiert ein std::basic_string-Objekt über eine geplante Größenänderung, damit es den Speicherplatz entsprechend verwalten kann.
  • Wenn new_cap größer als die aktuelle capacity() ist, wird neuer Speicher zugewiesen und capacity() wird gleich oder größer als new_cap gemacht.
  • Wenn new_cap kleiner als die aktuelle capacity() ist, ist dies eine nicht bindende Anfrage zur Verkleinerung.
  • Wenn new_cap kleiner als die aktuelle size() ist, ist dies eine nicht bindende Anfrage zur Verkleinerung auf die aktuelle Größe äquivalent zu shrink_to_fit()(seit C++11).
(bis C++20)
  • Wenn new_cap kleiner oder gleich der aktuellen capacity() ist, hat dies keine Auswirkung.
(seit C++20)
Wenn eine Kapazitätsänderung stattfindet, werden alle Iteratoren und Referenzen, einschließlich des Past-the-End-Iterators, ungültig.
2) Eine nicht bindende Anfrage zur Verkleinerung auf die aktuelle Größe. Nach diesem Aufruf hat capacity() einen nicht spezifizierten Wert, der größer oder gleich size() ist.

Inhalt

[bearbeiten] Parameter

new_cap - neue Kapazität des Strings

[bearbeiten] Rückgabewert

(keine)

[bearbeiten] Ausnahmen

Löst std::length_error aus, wenn new_cap größer als max_size() ist.

Kann Ausnahmen auslösen, die von std::allocator_traits<Allocator>::allocate() ausgelöst werden, wie z. B. std::bad_alloc.

Wenn aus irgendeinem Grund eine Ausnahme ausgelöst wird, hat diese Funktion keine Auswirkungen (starkes Ausnahmesicherheitsgarantie).

[bearbeiten] Komplexität

Höchstens linear in der size() des Strings.

[bearbeiten] Beispiel

#include <cassert>
#include <iostream>
#include <string>
 
int main()
{
    std::string s;
    std::cout << "1) Initially: " << s.capacity() << '\n';
 
    const std::string::size_type new_cap{101u};
    s.reserve(new_cap);
    assert(s.capacity() >= new_cap);
    std::cout << "2) After reserve(" << new_cap << "): " << s.capacity() << '\n';
 
    // observing the capacity growth factor
    auto cap{s.capacity()};
    for (int check{}; check != 4; ++check)
    {
        while (cap == s.capacity())
            s += '$';
        cap = s.capacity();
        std::cout << (3) + check << ") Capacity: " << cap << '\n';
    }
 
//  s.reserve(); // deprecated/removed in C++20/26, use:
    s.shrink_to_fit();
    std::cout << "7) After shrink_to_fit: " << s.capacity() << '\n';
}

Mögliche Ausgabe

1) Initially: 15
2) After reserve(101): 101
3) Capacity: 202
4) Capacity: 404
5) Capacity: 808
6) Capacity: 1616
7) After shrink_to_fit: 809

[bearbeiten] Fehlerberichte

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 847 C++98 Es gab keine Ausnahmesicherheitsgarantie starke Ausnahmesicherheitsgarantie hinzugefügt

[bearbeiten] Siehe auch

gibt die Anzahl der Zeichen zurück, die im aktuell zugewiesenen Speicher gehalten werden können
(public member function) [edit]
ändert die Anzahl der gespeicherten Zeichen
(public member function) [edit]