C++ named requirements: Container
Un Container es un objeto utilizado para almacenar otros objetos y se encarga de la gestión de la memoria utilizada por los objetos que contiene.
Contenidos |
Requisitos
Dados los siguientes tipos y valores:
| Tipo | Definición |
T
|
un tipo de objeto |
C
|
una clase contenedora que contiene objetos de tipo
T
|
| Valor | Definición |
| u , v |
valores de tipo
C
o
const
C
|
| mv |
un valor de tipo
C
|
| cv | un valor de tipo const C |
| lhs , rhs |
lvalues de tipo
C
|
| i , j |
valores de tipo
C::iterator
o
const
C
::
iterator
|
C
satisface los requisitos de
Container
si los siguientes tipos, declaraciones y expresiones están bien formados y tienen la semántica especificada:
Tipos
| Tipo | Definición | Requisitos |
|---|---|---|
| typename C :: value_type |
T
|
T
es
CopyConstructible
(hasta C++11)
Erasable
desde
C
(desde C++11)
.
|
| typename C :: reference |
T&
|
Sin requisito explícito |
| typename C :: const_reference | const T & | |
| typename C :: iterator | un tipo de iterador |
|
| typename C :: const_iterator | un tipo de iterador constante |
C::const_iterator
es un
LegacyForwardIterator
, y su
tipo de valor
es
T
.
|
| typename C :: difference_type | un tipo entero con signo |
C::difference_type
es el mismo que el
tipo de diferencia
de
C::iterator
y
C::const_iterator
.
|
| typename C :: size_type | un tipo entero sin signo |
C::size_type
es suficientemente grande para representar todos los valores no negativos de
C::difference_type
.
|
Declaraciones
| Declaración | Semántica | Complejidad | |||
|---|---|---|---|---|---|
|
C c
;
C c = C ( ) ; |
Poscondición | c. empty ( ) es true . | constante | ||
|
C c
(
v
)
;
C c = C ( v ) ; |
Precondición |
|
lineal [1] | ||
| Poscondición |
|
||||
| Notas | |||||
|
|||||
Expresiones
| Expresión | Tipo | Semántica | Complejidad | |||||
|---|---|---|---|---|---|---|---|---|
| C ( ) |
C
|
Postcondición | C ( ) . empty ( ) es true . | constante | ||||
| C ( v ) |
C
|
Precondición |
|
constante [1] | ||||
| Postcondición |
|
|||||||
| lhs = v |
C&
|
Postcondición |
|
lineal | ||||
| v.~C ( ) | void | Efecto | Destruye todos los elementos de v y desasigna toda la memoria obtenida. | lineal | ||||
| mv. begin ( ) |
C::iterator
|
Efecto | Devuelve un iterador que apunta al primer elemento de mv . | constante | ||||
| cv. begin ( ) |
C::const_iterator
|
Efecto | Devuelve un iterador que apunta al primer elemento de cv . | constante | ||||
| mv. end ( ) |
C::iterator
|
Efecto | Devuelve el iterador pasado-el-final de mv . | constante | ||||
| cv. end ( ) |
C::const_iterator
|
Efecto | Devuelve el iterador pasado-el-final de cv . | constante | ||||
|
v.
cbegin
(
)
(desde C++11) |
C::const_iterator
|
Efecto | Devuelve const_cast < const C & > ( v ) . begin ( ) . | constante | ||||
|
v.
cend
(
)
(desde C++11) |
C::const_iterator
|
Efecto | Devuelve const_cast < const C & > ( v ) . end ( ) . | constante | ||||
|
i
<=>
j
(desde C++20) |
std::strong_ordering | Restricción |
Esta expresión solo necesita estar bien formada si
C::iterator
satisface los requisitos de iterador de acceso aleatorio.
|
constante | ||||
| u == v | bool | Efecto |
Devuelve
|
lineal [2] | ||||
| u ! = v | Efecto | Equivalente a ! ( u == v ) . | ||||||
|
lhs.
swap
(
rhs
)
swap ( lhs, rhs ) |
void | Efecto | Intercambia los contenidos de lhs y rhs . | constante [3] | ||||
| v. size ( ) |
C::size_type
|
Efecto | Devuelve el número de elementos [4] de v . | constante | ||||
| v. max_size ( ) |
C::size_type
|
Efecto |
Devuelve el número de elementos del contenedor más grande posible de tipo
C
.
|
constante | ||||
| v. empty ( ) | bool | Efecto | Devuelve v. begin ( ) == v. end ( ) . | constante | ||||
|
Requisitos opcionales de contenedor
(solo proporcionados para algunos tipos de contenedores) |
||||||||
|
u
<=>
v
(desde C++20) |
synth-three-way-result
<
C
::
value_type
>
|
Precondición |
Ya sea que
T
cumpla con el modelo
three_way_comparable
, o que
operator
<
sea una relación de orden total definida para valores de tipo
T
y
const
T
.
|
lineal | ||||
| Efecto |
Retorna
std::
lexicographical_compare_three_way
(
u.
begin
(
)
, u.
end
(
)
,
v.
begin
(
)
, v.
end
(
)
,
synth-three-way
)
[5]
.
|
|||||||
| Notas | ||||||||
|
||||||||
En las expresiones
i
==
j
,
i
!
=
j
,
i
<
j
,
i
<=
j
,
i
>=
j
,
i
>
j
y
i
-
j
, si
i
y/o
j
son reemplazados por iteradores de tipo
C::const_iterator
que apuntan al mismo elemento respectivamente, la semántica permanece igual.
Carreras de datos en contenedores
Ver seguridad de hilos en contenedores .
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 179 | C++98 |
iterator
y
const_iterator
podrían ser incomparables
|
se requiere que sean comparables |
| LWG 276 | C++98 |
T
se requería que fuera
CopyAssignable
|
T
se requiere que sea
CopyConstructible |
| LWG 322 | C++98 |
los tipos de valor de
iterator
y
const_iterator
no estaban especificados
|
especificados como
T
|
| LWG 774 | C++98 | no había requisito sobre swap ( a, b ) | añadido |
| LWG 883 | C++98 |
a.
swap
(
b
)
se definía como
swap
(
a, b
)
,
resultaba en definición circular |
definido como intercambiar
los valores de a y b |
| LWG 1319 | C++98 |
iterator
y
const_iterator
podrían no tener garantía multipase |
se requiere que cumplan
los requisitos de LegacyForwardIterator |
|
LWG 2114
( P2167R3 ) |
C++98 | los tipos de retorno no- bool de algunas funciones estaban permitidos | no permitidos |
| LWG 2182 | C++98 |
los tipos denotados por
reference
y
const_reference
estaban pobremente especificados
|
redacción mejorada |
| LWG 2257 | C++98 |
dos contenedores requerían tiempo lineal para compararse
iguales incluso si tenían tamaños diferentes |
solo requiere tiempo
constante en este caso |
| LWG 2263 | C++11 | la resolución de LWG issue 179 fue eliminada accidentalmente en C++11 | restaurada |
| LWG 2839 | C++11 | la auto-asignación de movimiento de contenedores estándar no estaba permitida |
permitida pero el
resultado no está especificado |
| N3346 | C++11 |
C::value_type
se requería que fuera
Destructible
|
se requiere que sea
Erasable
de
C
|
Véase también
|
Documentación de C++
para
Biblioteca de contenedores
|