2012-02-23 5 views
6

En C++ 11, std :: vector tiene el constructor vector(size_type n) que construirá de forma predeterminada n elementos en su lugar, que se pueden usar con las clases predeterminadas, movibles y no copiables.¿Por qué no hay vector (tamaño_tipo n, const Allocator & alloc) en C++ 11?

Sin embargo, a diferencia de cualquier otro constructor de vector, no hay una variante que tiene un asignador, y he recurrido a lo siguiente:

// Foo is default constructible and moveable, but not copyable 
const int n = 10; // Want 10 default constructed Foos 
std::vector<Foo, CustomAllocator> foos(allocator); 
foos.reserve(n); 
for (int i = 0; i < n; ++i) 
    foos.emplace_back(); 

¿Hay una mejor manera de lograr esto? ¿Hay alguna razón específica por la que vector(size_type n, const Allocator& alloc) haya sido omitido de la norma?

+0

Suena como un defecto en la especificación. Presente un informe, si alguno ya no está allí. –

+0

@NicolBolas ¿hay documentos que describan el proceso para presentar un informe? – rkjnsn

+0

No importa. Ver mi publicación. –

Respuesta

7

Después de pensarlo, podría no ser un defecto después de todo.

Es posible que allocator_type y value_type son perversamente el mismo tipo. En ese caso, ¿qué función llamaría a vector(3, alloc)? ¿El constructor que toma un valor predeterminado para copiar-inicializar en todos los elementos, o el que toma un tamaño y un asignador? Eso es ambiguo, y por lo tanto un error de compilación.

+0

¡Yikes! No creo que hubiera pensado en eso alguna vez. – rkjnsn

+1

Se puede solucionar fácilmente con ['std :: allocator_arg'] (http://en.cppreference.com/w/cpp/memory/allocator_arg), que ya se usa en otros lugares (por ejemplo,' std :: tuple'). La versión del asignador sería entonces 'vector (3, std :: allocator_arg, alloc)'. – Xeo

+3

La biblioteca estándar a menudo tiene que evitar usar el mismo número de parámetros en las sobrecargas de funciones con parámetros de plantilla. Por ejemplo, esta es la razón por la cual, al final, no introdujeron un estándar vard :: max y, en su lugar, fueron con una versión que toma una lista de inicializadores. Una versión variad sería imposible de implementar de una manera fácil de usar al tiempo que permite la comparación personalizada. – bames53

6

En primer lugar, en vez de su cosita/bucle reserve, puede simplemente usar resize para lograr lo que su constructor imaginado que haría:

const int n = 10; 
std::vector<Foo, Alloc> foos(allocator); 
foo.resize(n); 

Otra opción es utilizar la versión de tres argumentos de la size_type n constructor:

const int n = 10; 
std::vector<Foo, Alloc> foos(n, Foo(), allocator); 

Aunque esto en realidad copia constructos en los elementos, que puede o no puede ser aceptable.

¿En la razón de ser? Ni idea. Probablemente pasado por alto.

+0

Gracias. Sabía que debía pasar por alto una manera más fácil. – rkjnsn

Cuestiones relacionadas