C++ named requirements: SequenceContainer
Ein SequenceContainer ist ein Container , der Objekte desselben Typs in einer linearen Anordnung speichert.
Inhaltsverzeichnis |
Anforderungen
Gegeben die folgenden Typen und Werte:
| Typ | Definition |
C
|
eine Sequenz-Container-Klasse |
T
|
der Elementtyp von
C
|
A
|
der Allokator-Typ von
C
:
|
R
(seit C++23)
|
ein Typ, der
container-compatible-range
<T>
modelliert
|
Args
(seit C++11)
|
ein Template-Parameter-Pack |
Iter
|
C::iterator
|
Ref
|
C::reference
|
CRef
|
C::const_reference
|
| Wert | Definition |
| v |
ein Wert vom Typ
C
|
| cv | ein Wert vom Typ const C |
| i , j |
LegacyInputIterator
s
, sodass
[
i
,
j
)
ein
gültiger Bereich
ist und die Iteratoren auf Elemente verweisen, die implizit in
C::value_type
konvertierbar sind
|
| rg (seit C++23) |
ein Wert vom Typ
R
|
| il (seit C++11) | ein Wert vom Typ std:: initializer_list < C :: value_type > |
| n |
ein Wert vom Typ
C::size_type
|
| p | ein gültiger const-Iterator in v |
| q | ein gültiger dereferenzierbarer const-Iterator in v |
| q1 , q2 |
const-Iteratoren in
v
, sodass
[
q1
,
q2
)
ein gültiger Bereich ist
|
| t |
ein Wert
(bis C++11)
ein
Lvalue
oder const Rvalue
(seit C++11)
vom Typ
C::value_type
|
| rv (seit C++11) |
ein nicht-konstanter Rvalue vom Typ
C::value_type
|
| args (seit C++11) |
ein Funktionsparameter-Pack mit dem Muster
Arg&&
|
C
erfüllt die Anforderungen von
SequenceContainer
wenn alle folgenden Bedingungen erfüllt sind:
-
Cerfüllt die Anforderungen eines Container . - Die folgenden Aussagen und Ausdrücke sind wohlgeformt und haben die spezifizierte Semantik:
|
Grundlegende Operationen
(erforderlich für alle Sequenzcontainer in der Standardbibliothek außer std::array (seit C++11) ) |
|||
|---|---|---|---|
| Statement | Semantik [1] | ||
| C c ( n, t ) ; | Effekt | Konstruiert den Sequenz-Container mit n Kopien von t . | |
| Vorbedingung |
|
||
| Postcondition | std:: distance ( c. begin ( ) , c. end ( ) ) ist n . | ||
| C c ( i, j ) ; | Effekt |
Konstruiert den Sequenzcontainer elementweise gleich dem Bereich
[
i
,
j
)
.
|
|
| Vorbedingung |
|
||
| Postcondition | std:: distance ( c. begin ( ) , c. end ( ) ) ist std:: distance ( i, j ) . | ||
| Expression | Type | Semantics | |
|
C
(
std::
from_range
, rg
)
(seit C++23) |
C
|
Effekt |
Konstruiert den Sequenzcontainer elementweise gleich dem Bereich
rg
.
|
| Vorbedingung |
T
ist
EmplaceConstructible
in
X
aus
*
ranges::
begin
(
rg
)
.
|
||
| Postcondition | std:: distance ( begin ( ) , end ( ) ) ist ranges:: distance ( rg ) . | ||
|
C
(
il
)
(seit C++11) |
C
|
Entspricht C ( il. begin ( ) , il. end ( ) ) . | |
|
v
=
il
(seit C++11) |
C&
|
Effekt | Weist den durch il repräsentierten Bereich v zu. [2] |
| Rückgabewert | * this | ||
| Vorbedingung |
T
ist
CopyInsertable
in
C
und
CopyAssignable
.
|
||
| Postcondition | Bestehende Elemente von v werden entweder zerstört oder zugewiesen. | ||
|
v.
emplace
(
p, args
)
(seit C++11) |
Iter
|
Effekt |
Fügt ein Objekt vom Typ
T
ein, konstruiert mit
std::
forward
<
Args
>
(
args
)
...
vor
p
.
|
| Rückgabewert | Ein Iterator, der auf das neue Element zeigt, das aus args in v konstruiert wurde. | ||
| Vorbedingung |
T
ist
EmplaceConstructible
in
C
aus
args
.
|
||
| v. insert ( p, t ) |
Iter
|
Effekt | Fügt eine Kopie von t vor p ein. |
| Rückgabewert | Ein Iterator, der auf die Kopie von t zeigt, die in v eingefügt wurde. | ||
| Vorbedingung |
|
||
|
v.
insert
(
p, rv
)
(seit C++11) |
Iter
|
Effekt | Fügt eine Kopie von rv vor p ein, möglicherweise unter Verwendung von Move-Semantik. |
| Rückgabewert | Ein Iterator, der auf die Kopie von rv zeigt, die in v eingefügt wurde. | ||
| Vorbedingung |
T
ist
MoveInsertable
in
C
.
|
||
| v. insert ( p, n, t ) |
Iter
|
Effekt | Fügt n Kopien von t vor p ein. |
| Rückgabewert | Ein Iterator, der auf die Kopie des ersten in v eingefügten Elements zeigt, oder p falls n gleich 0 ist. | ||
| Vorbedingung |
|
||
| v. insert ( p, i, j ) |
Iter
|
Effekt |
Fügt Kopien der Elemente im Bereich
[
i
,
j
)
vor
p
ein.
|
| Rückgabewert | Ein Iterator, der auf die Kopie des ersten in v eingefügten Elements zeigt, oder p falls i == j true ist. | ||
| Vorbedingung |
|
||
|
v.
insert_range
(
p, rg
)
(seit C++23) |
Iter
|
Effekt |
Fügt Kopien der Elemente aus
rg
vor
p
ein.
|
| Rückgabewert | Ein Iterator, der auf die Kopie des ersten in v eingefügten Elements zeigt, oder p falls rg leer ist. | ||
| Vorbedingung |
|
||
|
v.
insert
(
p, il
)
(seit C++11) |
Iter
|
Entspricht v. insert ( p, il. begin ( ) , il. end ( ) ) . | |
| v. erase ( q ) |
Iter
|
Effekt | Löscht das Element, auf das q zeigt. |
| Rückgabewert | Ein Iterator, der auf das Element unmittelbar nach q vor dem Löschen des Elements zeigt, oder v. end ( ) falls kein solches Element existiert. | ||
| v. erase ( q1, q2 ) |
Iter
|
Effekt |
Löscht Elemente im Bereich
[
q1
,
q2
)
.
|
| Rückgabewert | Ein Iterator, der auf das Element zeigt, auf das zuvor q2 gezeigt hat, bevor Elemente gelöscht wurden, oder v. end ( ) falls kein solches Element existiert. | ||
| v. clear ( ) | void | Effekt |
Zerstört alle Elemente in
v
.
|
| Postcondition | v. empty ( ) ist true . | ||
| Komplexität | Linear. | ||
| v. assign ( i, j ) | void | Effekt |
Ersetzt Elemente in
v
durch eine Kopie von
[
i
,
j
)
.
|
| Vorbedingung |
|
||
|
v.
assign_range
(
rg
)
(seit C++23) |
void | Effekt |
Ersetzt Elemente in
v
mit einer Kopie jedes Elements in
rg
.
|
| Vorbedingung |
|
||
|
v.
assign
(
il
)
(seit C++11) |
void | Entspricht v. assign ( il. begin ( ) , il. end ( ) ) . | |
| v. assign ( n, t ) | void | Effekt | Ersetzt Elemente in v durch n Kopien von t . |
| Vorbedingung |
|
||
|
Zusätzliche Operationen
[3]
(nur für spezifizierte Sequenzcontainer erforderlich, Auslassung von
std::
)
|
|||
| Expression | Type | Semantics | |
| v. front ( ) |
Ref
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
,
list
,
forward_list
|
| Rückgabewert | * v. begin ( ) | ||
| cv. front ( ) |
CRef
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
,
list
,
forward_list
|
| Rückgabewert | * cv. begin ( ) | ||
| v. back ( ) |
Ref
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
,
list
|
| Entspricht auto tmp = v. end ( ) ; -- tmp ; return * tmp ; [4] . | |||
| cv. back ( ) |
CRef
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
,
list
|
| Entspricht auto tmp = cv. end ( ) ; -- tmp ; return * tmp ; [5] . | |||
|
v.
emplace_front
(
args
)
(seit C++11) |
void | Container |
deque
,
list
,
forward_list
|
| Effekt |
Fügt ein Objekt vom Typ
T
voran, das mit
std::
forward
<
Args
>
(
args
)
...
konstruiert wurde.
|
||
| Rückgabewert | v. front ( ) | ||
| Vorbedingung |
T
ist
EmplaceConstructible
in
C
aus
args
.
|
||
|
v.
emplace_back
(
args
)
(seit C++11) |
void | Container |
vector
,
inplace_vector
,
deque
,
list
|
| Effekt |
Fügt ein Objekt vom Typ
T
hinzu, das mit
std::
forward
<
Args
>
(
args
)
...
konstruiert wurde.
|
||
| Rückgabewert | v. back ( ) | ||
| Vorbedingung |
T
ist
EmplaceConstructible
in
C
aus
args
.
|
||
| v. push_front ( t ) | void | Container |
deque
,
list
,
forward_list
|
| Effekt | Fügt eine Kopie von t voran. | ||
| Vorbedingung |
|
||
|
v.
push_front
(
rv
)
(seit C++11) |
void | Container |
deque
,
list
,
forward_list
|
| Effekt | Fügt eine Kopie von rv voran, möglicherweise unter Verwendung von Move-Semantik. | ||
| Vorbedingung |
T
ist
MoveInsertable
in
C
.
|
||
|
v.
prepend_range
(
rg
)
(seit C++23) |
void | Container |
deque
,
list
,
forward_list
|
| Effekt |
Fügt
[6]
Kopien von Elementen in
rg
vor
v.
begin
(
)
ein.
|
||
| Vorbedingung |
T
ist
EmplaceConstructible
in
C
von
*
ranges::
begin
(
rg
)
.
|
||
| v. push_back ( t ) | void | Container |
basic_string
,
vector
,
inplace_vector
,
deque
,
list
|
| Effekt | Hängt eine Kopie von t an. | ||
| Vorbedingung |
|
||
|
v.
push_back
(
rv
)
(seit C++11) |
void | Container |
basic_string
,
vector
,
inplace_vector
,
deque
,
list
|
| Effekt | Hängt eine Kopie von rv an, möglicherweise unter Verwendung von Move-Semantik. | ||
| Vorbedingung |
T
ist
MoveInsertable
in
C
.
|
||
|
v.
append_range
(
rg
)
(seit C++23) |
void | Container |
vector
,
inplace_vector
,
deque
,
list
|
| Effekt |
Fügt
[6]
Kopien von Elementen in
rg
vor
v.
end
(
)
ein.
|
||
| Vorbedingung |
T
ist
EmplaceConstructible
in
C
aus
*
ranges::
begin
(
rg
)
.
|
||
| v. pop_front ( ) | void | Container |
deque
,
list
,
forward_list
|
| Effekt | Zerstört das erste Element. | ||
| Vorbedingung | a. empty ( ) ist false . | ||
| v. pop_back ( ) | void | Container |
basic_string
,
vector
,
inplace_vector
,
deque
,
list
|
| Effekt | Zerstört das letzte Element. | ||
| Vorbedingung | a. empty ( ) ist false . | ||
| v [ n ] |
Ref
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
|
| Entspricht return * ( v. begin ( ) + n ) ; . | |||
| cv [ n ] |
CRef
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
|
| Entspricht return * ( cv. begin ( ) + n ) ; . | |||
| v. at ( n ) |
Ref
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
|
| Rückgabewert | * ( v. begin ( ) + n ) | ||
| Exceptions | Wirft std::out_of_range falls n >= v. size ( ) true ist. | ||
| cv. at ( n ) |
CRef
|
Container |
basic_string
,
array
,
vector
,
inplace_vector
,
deque
|
| Rückgabewert | * ( cv. begin ( ) + n ) | ||
| Exceptions | Wirft std::out_of_range wenn n >= cv. size ( ) true ist. | ||
| Hinweise | |||
|
|||
Zusätzlich, für jeden Sequenzcontainer:
-
Ein Konstruktor-Template, das zwei Input-Iteratoren akzeptiert, und die Member-Funktions-Template-Überladungen von
insert,append,assign,replace, die zwei Input-Iteratoren akzeptieren, nehmen nicht an der Überladungsauflösung teil, wenn das entsprechende Template-Argument nicht LegacyInputIterator erfüllt.
|
(seit C++17) |
Standardbibliothek
Die folgenden Standardbibliothek-String-Typen und Container erfüllen die SequenceContainer -Anforderungen:
|
speichert und manipuliert Zeichenfolgen
(Klassentemplate) |
|
|
(C++11)
|
festgroße Inplace-kontinuierliche Array
(Klassentemplate) |
|
veränderbare kontinuierliche Array
(Klassentemplate) |
|
|
(C++26)
|
veränderbare, feste Kapazität, Inplace-kontinuierliche Array
(Klassentemplate) |
|
doppelseitige Warteschlange
(Klassentemplate) |
|
|
(C++11)
|
einfach verkettete Liste
(Klassentemplate) |
|
doppelt verkettete Liste
(Klassentemplate) |
Verwendungshinweise
| Container | Vorteile | Nachteile |
|---|---|---|
| std::vector | Schneller Zugriff, zusammenhängende Speicherung | Größtenteils ineffiziente Einfügungen/Löschungen |
| std:: inplace_vector | Schneller Zugriff, Inplace-zusammenhängende Speicherung | Feste Kapazität und größtenteils ineffiziente Einfügungen/Löschungen |
| std::array | Schneller Zugriff, Inplace-zusammenhängende Speicherung | Feste Elementanzahl und keine Einfügung/Löschung |
| std::deque | Schneller Zugriff, effiziente Einfügung/Löschung am Anfang/Ende | Ineffiziente Einfügung/Löschung in der Mitte der Sequenz |
|
std::list
std::forward_list |
Effiziente Einfügung/Löschung in der Mitte der Sequenz | Zugriff ist größtenteils linear in der Zeit |
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 139 | C++98 |
die optionalen Operationen waren nicht erforderlich
für die bezeichneten Container implementiert zu werden |
mit amortisierter Zeit erforderlich |
| LWG 149 | C++98 |
v.
insert
(
p, t
)
gab
Iter
zurück, während
v. insert ( p, n, t ) und v. insert ( p, n, t ) void zurückgaben |
alle geben
Iter
zurück
|
| LWG 151 | C++98 | q1 musste dereferenzierbar sein [1] | kann nicht-dereferenzierbar sein |
| LWG 355 | C++98 |
Aufruf von
v.
back
(
)
oder
v.
pop_back
(
)
würde
-- v. end ( ) ausführen, was gefährlich ist [2] |
dekrementiert eine Kopie
von v. end ( ) stattdessen |
| LWG 589 | C++98 |
die Elemente, auf die
i
und
j
verweisen,
könnten nicht konvertierbar zu
C::value_type
sein
|
sie sind implizit
konvertierbar zu
C::value_type
|
| LWG 2194 | C++11 |
std::queue
,
std::priority_queue
und
std::stack waren ebenfalls SequenceContainer s [3] |
sie sind keine SequenceContainer s |
| LWG 2231 | C++11 |
die Komplexitätsanforderung von
v.
clear
(
)
wurde in C++11 fälschlicherweise ausgelassen |
Komplexität als linear bestätigt |
| LWG 3927 | C++98 | operator [ ] hatte keine implizite Anforderung | implizite Anforderung hinzugefügt |
- ↑ Es handelt sich um einen Defekt, weil das Verhalten von v. erase ( v. begin ( ) , v. end ( ) ) undefiniert ist, falls v ein leerer Container ist.
- ↑ Falls der Typ von v. end ( ) ein fundamentaler Typ ist, ist -- v. end ( ) fehlerhaft. Es ist gefährlich, wenn der Typ von v templatisiert ist, da dieser Fehler in diesem Fall schwer zu finden sein kann.
- ↑ Sie wurden in C++98 nicht als SequenceContainer s dokumentiert.