Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: Container

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Ein Container ist ein Objekt, das zur Speicherung anderer Objekte verwendet wird und für die Verwaltung des von den enthaltenen Objekten genutzten Speichers zuständig ist.

Inhalt

[bearbeiten] Anforderungen

Gegeben seien die folgenden Typen und Werte

Typ Definition
T ein Objekttyp
C eine Containerklasse, die Objekte vom Typ T enthält
Wert Definition
u, v Werte vom Typ C oder const C
mv ein Wert vom Typ C
cv ein Wert vom Typ const C
lhs, rhs lvalues vom Typ C
i, j Werte vom Typ C::iterator oder const C::iterator

C erfüllt die Anforderungen an einen Container, wenn die folgenden Typen, Anweisungen und Ausdrücke wohlgeformt sind und die angegebene Semantik haben

[bearbeiten] Typen

Typ Definition Anforderungen
typename C::value_type T T ist CopyConstructible(bis C++11)Erasable aus C(seit C++11).
typename C::reference T& Keine explizite Anforderung
typename C::const_reference const T&
typename C::iterator ein Iteratortyp
typename C::const_iterator ein konstanter Iteratortyp C::const_iterator ist ein LegacyForwardIterator, und sein value type ist T.
typename C::difference_type ein vorzeichenbehafteter Ganzzahltyp C::difference_type ist derselbe wie der difference type von C::iterator und C::const_iterator.
typename C::size_type ein vorzeichenloser Ganzzahltyp C::size_type ist groß genug, um alle nicht-negativen Werte von C::difference_type darzustellen.

[bearbeiten] Anweisungen

Anweisung Semantik  Komplexität 
C c;

C c = C();

Nachbedingung  c.empty() ist true. konstant
C c(v);

C c = C(v);

Vorbedingung

Wenn v kein rvalue vom Typ C ist, ist T CopyInsertable in C.

(seit C++11)
linear[1]
Nachbedingung
  • Wenn v ein lvalue ist, ist c == v true.
  • Wenn v ein rvalue ist, und c und v sich nicht auf dasselbe Objekt beziehen(seit C++11), ist c gleich dem Wert, den v vor dieser Konstruktion hatte.
Anmerkungen
  1. Wenn v ein rvalue vom Typ C ist und C keine Spezialisierung von std::array oder std::inplace_vector ist, ist die Komplexität konstant.

[bearbeiten] Ausdrücke

Ausdruck Typ Semantik  Komplexität 
C() C Nachbedingung  C().empty() ist true. konstant
C(v) C Vorbedingung

Wenn v kein rvalue vom Typ C ist, ist T CopyInsertable in C.

(seit C++11)
konstant[1]
Nachbedingung
  • Wenn v ein lvalue ist, ist C(v) == v true.
  • Wenn v ein rvalue ist, und C(v) und v sich nicht auf dasselbe Objekt beziehen(seit C++11), ist C(v) gleich dem Wert, den v vor dieser Konstruktion hatte.
lhs = v C& Nachbedingung
  • Wenn v ein lvalue ist, ist lhs == v true.
  • Wenn v ein rvalue ist, und lv und v sich nicht auf dasselbe Objekt beziehen(seit C++11), ist lhs gleich dem Wert, den v vor dieser Zuweisung hatte.
linear
v.~C() void Auswirkung Zerstört alle Elemente von v und gibt allen erhaltenen Speicher frei. linear
mv.begin() C::iterator Auswirkung Gibt einen Iterator zurück, der auf das erste Element von mv zeigt. konstant
cv.begin() C::const_iterator Auswirkung Gibt einen Iterator zurück, der auf das erste Element von cv zeigt. konstant
mv.end() C::iterator Auswirkung Gibt den Past-the-end-Iterator von mv zurück. konstant
cv.end() C::const_iterator Auswirkung Gibt den Past-the-end-Iterator von cv zurück. konstant
v.cbegin()
(seit C++11)
C::const_iterator Auswirkung Gibt const_cast<const C&>(v).begin() zurück. konstant
v.cend()
(seit C++11)
C::const_iterator Auswirkung Gibt const_cast<const C&>(v).end() zurück. konstant
i <=> j
(seit C++20)
std::strong_ordering     Beschränkung Dieser Ausdruck muss nur wohlgeformt sein, wenn C::iterator die Anforderungen an zufällige Zugriffsimiteratoren erfüllt. konstant
u == v bool Auswirkung Gibt zurück
u.size() == v.size() &&
    std::equal(u.begin(),
         u.end(), v.begin())
(bis C++14)
std::equal(u.begin(), u.end(),
           v.begin(), v.end())
(seit C++14)
.
linear[2]
u != v Auswirkung Entspricht !(u == v).
lhs.swap(rhs)

swap(lhs, rhs)

void Auswirkung Vertauscht die Inhalte von lhs und rhs. konstant[3]
v.size() C::size_type Auswirkung Gibt die Anzahl der Elemente[4] von v zurück. konstant
v.max_size() C::size_type Auswirkung Gibt die maximale Anzahl von Elementen des größten möglichen Containers vom Typ C zurück. konstant
v.empty() bool Auswirkung Gibt v.begin() == v.end() zurück. konstant
Optionale Container-Anforderungen
(nur für bestimmte Containertypen bereitgestellt)
u <=> v
(seit C++20)
synth-three-way-result
    <C::value_type>
Vorbedingung Entweder modelliert T three_way_comparable oder operator< ist eine totale Ordnungsrelation, die für Werte vom Typ T und const T definiert ist. linear
Auswirkung Gibt std::lexicographical_compare_three_way
    (u.begin(), u.end(),
     v.begin(), v.end(),
     synth-three-way )
zurück[5].
Anmerkungen
  1. Wenn v ein rvalue vom Typ C ist und C eine Spezialisierung von std::array oder std::inplace_vector ist, ist die Komplexität linear.
  2. Wenn u.size() != v.size() true ist, ist die Komplexität konstant.
  3. Wenn C eine Spezialisierung von std::array oder std::inplace_vector ist, ist die Komplexität linear.
  4. Die Anzahl der Elemente wird durch die Regeln von Konstruktoren, Einfügungen und Löschungen bestimmt. Sie entspricht dem Wert von std::distance(v.begin(), v.end()).
  5. Wenn die an std::lexicographical_compare_three_way übergebenen Iteratoren ConstexprIteratoren sind, wird die Operation durch constexpr-Funktionen implementiert.

Bei den Ausdrücken i == j, i != j, i < j, i <= j, i >= j, i > j und i - j, wenn i und/oder j durch Iteratoren vom Typ C::const_iterator ersetzt werden, die auf dasselbe Element zeigen, bleibt die Semantik gleich.

[bearbeiten] Container Datenrennen

Siehe Container-Threadsicherheit.

[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 179 C++98 iterator und const_iterator Typen könnten unvergleichbar sein vergleichbar sein müssen
LWG 276 C++98 T war erforderlich, um CopyAssignable zu sein T ist erforderlich zu sein
CopyConstructible
LWG 322 C++98 Die value types von iterator und const_iterator waren nicht spezifiziert als T spezifiziert
LWG 774 C++98 Es gab keine Anforderung an swap(a, b) hinzugefügt
LWG 883 C++98 a.swap(b) wurde definiert als swap(a, b),
führte zu einer zirkulären Definition
definiert als Vertauschen
der Werte von a und b
LWG 1319 C++98 iterator und const_iterator
hätten möglicherweise keine Multipass-Garantie
sie müssen erfüllen
die Anforderungen an
LegacyForwardIterator
LWG 2114
(P2167R3)
C++98 nicht-bool Rückgabetypen einiger Funktionen waren erlaubt disallowed
LWG 2182 C++98 die durch reference und
const_reference bezeichneten Typen waren schlecht spezifiziert
verbesserte Formulierung
LWG 2257 C++98 Zwei Container erforderten für den Vergleich lineare Zeit
gleich, auch wenn sie unterschiedliche Größen haben
erfordert nur konstante
Zeit in diesem Fall
LWG 2263 C++11 Die Lösung von LWG-Problem 179 wurde versehentlich in C++11 fallen gelassen. wiederhergestellt
LWG 2839 C++11 Self-Move-Zuweisung von Standardcontainern war nicht erlaubt erlaubt, aber das
Ergebnis ist undefiniert
N3346 C++11 C::value_type war erforderlich, um Destructible zu sein erforderlich, um Erasable aus C zu sein

[bearbeiten] Siehe auch

C++ Dokumentation für Container-Bibliothek