Namespaces
Variants

std::vector<T,Allocator>::vector

De es.cppreference.net
 
 
 
 
vector() : vector(Allocator()) {}
(1) (desde C++11)
(hasta C++17)
vector() noexcept(noexcept(Allocator())) : vector(Allocator()) {}
(desde C++17)
(constexpr desde C++20)
explicit vector( const Allocator& alloc = Allocator() );
(2) (hasta C++11)
explicit vector( const Allocator& alloc );
(desde C++11)
(noexcept desde C++17)
(constexpr desde C++20)
explicit vector( size_type count,
                 const Allocator& alloc = Allocator() );
(3) (desde C++11)
explicit vector( size_type count, const T& value = T(),
                 const Allocator& alloc = Allocator() );
(4) (hasta C++11)
vector( size_type count, const T& value,
        const Allocator& alloc = Allocator() );
(desde C++11)
(constexpr desde C++20)
template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );
(5) (constexpr desde C++20)
template< container-compatible-range<T> R >
constexpr vector( std::from_range_t, R&& rg,
                  const Allocator& alloc = Allocator() );
(6) (desde C++23)
vector( const vector& other );
(7) (constexpr desde C++20)
vector( vector&& other );
(8) (desde C++11)
(noexcept desde C++17)
(constexpr desde C++20)
vector( const vector& other, const Allocator& alloc );
(9) (desde C++11)
(constexpr desde C++20)
(hasta C++23)
constexpr vector( const vector& other,
                  const std::type_identity_t<Allocator>& alloc );
(desde C++23)
vector( vector&& other, const Allocator& alloc );
(10) (desde C++11)
(constexpr desde C++20)
(hasta C++23)
constexpr vector( vector&& other,
                  const std::type_identity_t<Allocator>& alloc );
(desde C++23)
vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
(11) (desde C++11)

Construye un nuevo vector a partir de una variedad de fuentes de datos, opcionalmente usando un asignador proporcionado por el usuario alloc.

1) El constructor predeterminado desde C++11. Construye un vector vacío con un asignador construido por defecto.
Si Allocator no es ConstruiblePorDefecto, el comportamiento es indefinido.
2) El constructor predeterminado hasta C++11. Construye un vector vacío con el asignador dado alloc.
3) Construye un vector con count objetos insertados por defecto de T. No se realizan copias.
Si T no es InsertablePorDefecto en std::vector<T>, el comportamiento es indefinido.
4) Construye un vector con count copias de elementos con valor value.

Si T no es InsertablePorCopia en std::vector<T>, el comportamiento es indefinido.

(desde C++11)
5) Construye un vector con el contenido del rango [first, last). Cada iterador en [first, last) es desreferenciado exactamente una vez.

Si InputIt no satisface los requisitos de IteradorDeEntradaHeredado, la sobrecarga (4) es llamada en su lugar con los argumentos static_cast<size_type>(first), last y alloc.

(hasta C++11)

Esta sobrecarga participa en la resolución de sobrecarga solo si InputIt satisface los requisitos de IteradorDeEntradaHeredado.

Si se cumple alguna de las siguientes condiciones, el comportamiento es indefinido:

(desde C++11)
6) Construye un vector con el contenido del rango rg. Cada iterador en rg es desreferenciado exactamente una vez.
Si se cumple alguna de las siguientes condiciones, el comportamiento es indefinido:
7-10) Construye un vector con el contenido de other.
7) El constructor de copia.

El asignador se obtiene como si se llamara a std::allocator_traits<Allocator>::select_on_container_copy_construction(alloc) donde alloc es el asignador de other.

(desde C++11)
8) El constructor de movimiento. El asignador se obtiene mediante construcción por movimiento desde other.get_allocator().
9) Igual que el constructor de copia, excepto que alloc se usa como asignador.
Si T no es InsertablePorCopia en std::vector<T>, el comportamiento es indefinido.
10) Igual que el constructor de movimiento, excepto que alloc se usa como asignador.
Si T no es InsertablePorMovimiento en std::vector<T>, el comportamiento es indefinido.
11) Equivalente a vector(il.begin(), il.end(), alloc).

Parámetros

alloc - asignador a utilizar para todas las asignaciones de memoria de este contenedor
count - el tamaño del contenedor
value - el valor con el que inicializar los elementos del contenedor
first, last - el par de iteradores que definen el rango de elementos desde el cual copiar los elementos
other - otro contenedor que se utilizará como fuente para inicializar los elementos del contenedor
init - lista de inicialización para inicializar los elementos del contenedor
rg - un rango compatible con el contenedor

Complejidad

1,2) Constante.
3,4) Lineal en count .
5) Dado std:: distance ( first, last ) como N :
  • El constructor de copia de T solo se llama N veces.
  • No ocurre reasignación de memoria.
  • En caso contrario:
  • El constructor de copia de T se llama O(N) veces.
  • Ocurre reasignación de memoria O(log N) veces.
6) Dado ranges:: distance ( rg ) como N :
(hasta C++26)
  • Si R satisface una de las siguientes condiciones:
entonces:
(desde C++26)
  • Inicializa exactamente N elementos desde el resultado de desreferenciar iteradores sucesivos de rg .
  • No ocurre reasignación de memoria.
  • En caso contrario:
  • El constructor de copia o movimiento de T es llamado O(N) veces.
  • Ocurre reasignación de memoria O(log N) veces.
7) Lineal en other. size ( ) .
8) Constante.
9) Lineal en other. size ( ) .
10) Lineal en other. size ( ) si alloc ! = other. get_allocator ( ) , en caso contrario constante.
11) Lineal en init. size ( ) .

Excepciones

Las llamadas a Allocator :: allocate pueden lanzar excepciones.

Notas

Después de la construcción por movimiento del contenedor (sobrecarga (8)), las referencias, punteros e iteradores que originalmente se refieren a elementos en other permanecen válidos, pero se refieren a elementos que ahora están en *this. El estándar actual garantiza esto mediante la declaración general en [container.reqmts]/67, y se está considerando una garantía más directa mediante LWG issue 2321.

Macro de prueba de característicasMacro Valor Estándar Característica
__cpp_lib_containers_ranges 202202L (C++23) conscientes de rangos construcción e inserción; sobrecarga (6)

Ejemplo

#include <iostream>
#include <string>
#include <vector>
template<typename T>
std::ostream& operator<<(std::ostream& s, const std::vector<T>& v)
{
    s.put('{');
    for (char comma[]{'\0', ' ', '\0'}; const auto& e : v)
        s << comma << e, comma[0] = ',';
    return s << "}\n";
}
int main()
{
    // Sintaxis de lista de inicialización de C++11:
    std::vector<std::string> words1{"the", "frogurt", "is", "also", "cursed"};
    std::cout << "1: " << words1;
    // words2 == words1
    std::vector<std::string> words2(words1.begin(), words1.end());
    std::cout << "2: " << words2;
    // words3 == words1
    std::vector<std::string> words3(words1);
    std::cout << "3: " << words3;
    // words4 es {"Mo", "Mo", "Mo", "Mo", "Mo"}
    std::vector<std::string> words4(5, "Mo");
    std::cout << "4: " << words4;
    const auto rg = {"cat", "cow", "crow"};
#ifdef __cpp_lib_containers_ranges
    std::vector<std::string> words5(std::from_range, rg); // sobrecarga (6)
#else
    std::vector<std::string> words5(rg.begin(), rg.end()); // sobrecarga (5)
#endif
    std::cout << "5: " << words5;
}

Salida:

1: {the, frogurt, is, also, cursed}
2: {the, frogurt, is, also, cursed}
3: {the, frogurt, is, also, cursed}
4: {Mo, Mo, Mo, Mo, Mo}
5: {cat, cow, crow}

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 134 C++98 la sobrecarga ( 5 ) permitía hasta 2N  llamadas al constructor
de copia en el caso de iteradores de entrada
cambiado a O(N) llamadas
LWG 438 C++98 la sobrecarga ( 5 ) solo llamaría a la sobrecarga ( 4 )
si InputIt es un tipo integral
llama a la sobrecarga ( 4 ) si InputIt
no es un LegacyInputIterator
LWG 2193 C++11 el constructor por defecto era explícito hecho no explícito
LWG 2210 C++11 la sobrecarga ( 3 ) no tenía un parámetro de asignador se añadió el parámetro
N3346 C++11 para la sobrecarga ( 3 ) , los elementos en
el contenedor se inicializaban por valor
se insertan por defecto

Véase también

asigna valores al contenedor
(función miembro pública)
asigna valores al contenedor
(función miembro pública)