C++ benannte Anforderungen: Container
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 |
|
linear[1] | ||
| Nachbedingung |
| ||||
| Anmerkungen | |||||
| |||||
[bearbeiten] Ausdrücke
| Ausdruck | Typ | Semantik | Komplexität | |||||
|---|---|---|---|---|---|---|---|---|
| C() | C
|
Nachbedingung | C().empty() ist true. | konstant | ||||
| C(v) | C
|
Vorbedingung |
|
konstant[1] | ||||
| Nachbedingung |
| |||||||
| lhs = v | C&
|
Nachbedingung |
|
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
|
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 | ||||||||
| ||||||||
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 seinCopyConstructible |
| 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_iteratorhä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 undconst_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
|