Namespaces
Variants

C++ named requirements: Container

From cppreference.net
C++ named requirements

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

Si v no es un rvalue de tipo C , T es CopyInsertable en C .

(desde C++11)
lineal [1]
Poscondición
  • Si v es un lvalue, c == v es true .
  • Si v es un rvalue , y c y v no se refieren al mismo objeto (desde C++11) , c es igual al valor que v tenía antes de esta construcción.
Notas
  1. Si v es un rvalue de tipo C , y C no es una especialización de std::array o std::inplace_vector , la complejidad es constante.

Expresiones

Expresión Tipo Semántica Complejidad
C ( ) C Postcondición C ( ) . empty ( ) es true . constante
C ( v ) C Precondición

Si v no es un rvalue de tipo C , T es CopyInsertable en C .

(desde C++11)
constante [1]
Postcondición
  • Si v es un lvalue, C ( v ) == v es true .
  • Si v es un rvalue , y C ( v ) y v no se refieren al mismo objeto (desde C++11) , C ( v ) es igual al valor que v tenía antes de esta construcción.
lhs = v C& Postcondición
  • Si v es un lvalue, lhs == v es true .
  • Si v es un rvalue , y lv y v no se refieren al mismo objeto (desde C++11) , lhs es igual al valor que v tenía antes de esta asignació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
u. size ( ) == v. size ( ) &&
std:: equal ( u. begin ( ) ,
u. end ( ) , v. begin ( ) )
(hasta C++14)
std:: equal ( u. begin ( ) , u. end ( ) ,
v. begin ( ) , v. end ( ) )
(desde C++14)
.
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
  1. Si v es un rvalue de tipo C , y C es una especialización de std::array o std::inplace_vector , la complejidad es lineal.
  2. Si u. size ( ) ! = v. size ( ) es true , la complejidad es constante.
  3. Si C es una especialización de std::array o std::inplace_vector , la complejidad es lineal.
  4. El número de elementos está definido por las reglas de constructores, inserciones y borrados. Es igual al valor de std:: distance ( v. begin ( ) , v. end ( ) ) .
  5. Si los iteradores pasados a std::lexicographical_compare_three_way son ConstexprIterator s , la operación se implementa mediante funciones constexpr .

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