C++ named requirements: Container
Ein Container ist ein Objekt, das zur Speicherung anderer Objekte verwendet wird und für die Verwaltung des von den enthaltenen Objekten verwendeten Speichers verantwortlich ist.
Inhaltsverzeichnis |
Anforderungen
Gegeben 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 eines
Container
, wenn die folgenden Typen, Aussagen und Ausdrücke wohlgeformt sind und die spezifizierte Semantik besitzen:
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
Werttyp
ist
T
.
|
| typename C :: difference_type | ein vorzeichenbehafteter Ganzzahltyp |
C::difference_type
ist identisch mit dem
Differenztyp
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.
|
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 | |||||
|
|||||
Ausdrücke
| Ausdruck | Typ | Semantik | Komplexität | |||||
|---|---|---|---|---|---|---|---|---|
| C ( ) |
C
|
Nachbedingung | C ( ) . empty ( ) ist true . | konstant | ||||
| C ( v ) |
C
|
Vorbedingung |
|
konstant [1] | ||||
| Postcondition |
|
|||||||
| lhs = v |
C&
|
Nachbedingung |
|
linear | ||||
| v.~C ( ) | void | Effekt | Zerstört alle Elemente von v und gibt den gesamten belegten Speicher frei. | linear | ||||
| mv. begin ( ) |
C::iterator
|
Effekt | Gibt einen Iterator zurück, der auf das erste Element von mv zeigt. | konstant | ||||
| cv. begin ( ) |
C::const_iterator
|
Effekt | Gibt einen Iterator zurück, der auf das erste Element von cv zeigt. | konstant | ||||
| mv. end ( ) |
C::iterator
|
Effekt | Gibt den Past-the-End-Iterator von mv zurück. | konstant | ||||
| cv. end ( ) |
C::const_iterator
|
Effekt | Gibt den Past-the-End-Iterator von cv zurück. | konstant | ||||
|
v.
cbegin
(
)
(seit C++11) |
C::const_iterator
|
Effekt | Gibt const_cast < const C & > ( v ) . begin ( ) zurück. | konstant | ||||
|
v.
cend
(
)
(seit C++11) |
C::const_iterator
|
Effekt | Gibt const_cast < const C & > ( v ) . end ( ) zurück. | konstant | ||||
|
i
<=>
j
(seit C++20) |
std::strong_ordering | Einschränkung |
Dieser Ausdruck muss nur wohlgeformt sein, wenn
C::iterator
die Anforderungen für Random-Access-Iteratoren erfüllt.
|
konstant | ||||
| u == v | bool | Effekt |
Gibt zurück
|
linear [2] | ||||
| u ! = v | Effekt | Entspricht ! ( u == v ) . | ||||||
|
lhs.
swap
(
rhs
)
swap ( lhs, rhs ) |
void | Effekt | Tauscht die Inhalte von lhs und rhs . | konstant [3] | ||||
| v. size ( ) |
C::size_type
|
Effekt | Gibt die Anzahl der Elemente [4] von v zurück. | konstant | ||||
| v. max_size ( ) |
C::size_type
|
Effekt |
Gibt die Anzahl der Elemente des größtmöglichen Containers vom Typ
C
zurück.
|
konstant | ||||
| v. empty ( ) | bool | Effekt | Gibt v. begin ( ) == v. end ( ) zurück. | konstant | ||||
|
Optionale Container-Anforderungen
(nur für einige Containertypen verfügbar) |
||||||||
|
u
<=>
v
(seit C++20) |
synth-three-way-result
<
C
::
value_type
>
|
Vorbedingung |
Entweder modelliert
T
three_way_comparable
, oder
operator
<
definiert eine totale Ordnungsrelation für Werte vom Typ
T
und
const
T
.
|
linear | ||||
| Effekt |
Gibt
std::
lexicographical_compare_three_way
(
u.
begin
(
)
, u.
end
(
)
,
v.
begin
(
)
, v.
end
(
)
,
synth-three-way
)
[5]
zurück.
|
|||||||
| Hinweise | ||||||||
|
||||||||
In 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.
Container-Datenrennen
Siehe Container-Threadsicherheit .
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 179 | C++98 |
iterator
und
const_iterator
könnten unvergleichbar sein
|
müssen vergleichbar sein |
| LWG 276 | C++98 |
T
musste
CopyAssignable
sein
|
T
muss
CopyConstructible sein |
| LWG 322 | C++98 |
die Werttypen 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
)
war definiert als
swap
(
a, b
)
,
führte zu zirkulärer Definition |
definiert als Austausch
der Werte von a und b |
| LWG 1319 | C++98 |
iterator
und
const_iterator
könnten keine Multipass-Garantie haben |
sie müssen die Anforderungen
von LegacyForwardIterator erfüllen |
|
LWG 2114
( P2167R3 ) |
C++98 | Nicht- bool Rückgabetypen einiger Funktionen waren erlaubt | nicht erlaubt |
| LWG 2182 | C++98 |
die durch
reference
und
const_reference
bezeichneten Typen waren schlecht spezifiziert
|
verbesserte Formulierung |
| LWG 2257 | C++98 |
zwei Container benötigten lineare Zeit zum Vergleich
auf Gleichheit, selbst bei unterschiedlichen Größen |
erfordert nur konstante
Zeit in diesem Fall |
| LWG 2263 | C++11 | die Lösung von LWG Issue 179 wurde versehentlich in C++11 entfernt | wiederhergestellt |
| LWG 2839 | C++11 | Selbst-Zuweisung durch Verschieben war bei Standardcontainern nicht erlaubt |
erlaubt, aber das
Ergebnis ist unspezifiziert |
| N3346 | C++11 |
C::value_type
musste
Destructible
sein
|
muss
Erasable
aus
C
sein
|
Siehe auch
|
C++ Dokumentation
für
Containers library
|