Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

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

Falls v kein Rvalue vom Typ C ist, ist T CopyInsertable in C .

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

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, muss T CopyInsertable in C sein.

(seit C++11)
konstant [1]
Postcondition
  • Wenn v ein Lvalue ist, ist C ( v ) == v true .
  • Wenn v ein Rvalue ist , und C ( v ) und v nicht auf dasselbe Objekt verweisen (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 nicht auf dasselbe Objekt verweisen (seit C++11) , ist lhs gleich dem Wert, den v vor dieser Zuweisung hatte.
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
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 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
  1. Wenn v ein R-Wert 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 definiert. Sie entspricht dem Wert von std:: distance ( v. begin ( ) , v. end ( ) ) .
  5. Wenn die an std::lexicographical_compare_three_way übergebenen Iteratoren ConstexprIterator s sind, wird die Operation durch constexpr -Funktionen implementiert.

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