2012-02-23 4 views
6

In C++ 11, std :: vector ha il costruttore vector(size_type n) che realizzerà automaticamente gli elementi n, che possono essere utilizzati con classi costruibili, mobili e non copiabili predefinite.Perché non esiste un vettore (size_type n, const Allocator & alloc) in C++ 11?

Tuttavia, a differenza di ogni altro costruttore di vettore, non v'è alcuna variante che prende un allocatore, e mi hanno fatto ricorso alle seguenti:

// 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(); 

C'è un modo migliore per ottenere questo risultato? C'è un motivo specifico per cui lo standard vector(size_type n, const Allocator& alloc) è stato omesso?

+0

Sembra un difetto nelle specifiche. Presenta un rapporto su di esso, se non lo sei già. –

+0

@NicolBolas esiste un documento che descrive il processo per la presentazione di un rapporto? – rkjnsn

+0

Non importa. Vedi il mio post. –

risposta

7

Dopo averci pensato, potrebbe non essere un difetto dopo tutto.

È possibile che allocator_type e value_type sono perversamente stesso tipo. In tal caso, quale funzione chiamerebbe vector(3, alloc)? Il costruttore che assume un valore predefinito su copy-initialize in tutti gli elementi o quello che prende una dimensione e un allocatore? Questo è ambiguo, e quindi un errore di compilazione.

+0

Yikes! Non penso che ci avrei mai pensato. – rkjnsn

+1

Facilmente risolvibile con ['std :: allocator_arg'] (http://en.cppreference.com/w/cpp/memory/allocator_arg), che è già utilizzato in altri posti (ad esempio' std :: tuple'). La versione allocatore sarebbe quindi 'vector (3, std :: allocator_arg, alloc)'. – Xeo

+3

La libreria standard deve spesso evitare di utilizzare lo stesso numero di parametri in sovraccarichi di funzioni con parametri basati su modelli. Ad esempio questo è il motivo per cui alla fine non hanno introdotto un variadic std :: max e invece è andato con una versione che prende una lista di inizializzatori. Una versione variadica sarebbe impossibile da implementare in un modo facile da usare pur consentendo il confronto personalizzato. – bames53

6

In primo luogo, al posto del tuo reserve/loop thingy, si può semplicemente utilizzare resize per ottenere ciò che il vostro costruttore immaginato avrebbe fatto:

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

Un'altra opzione è quella di utilizzare la versione a tre argomenti del costruttore size_type n:

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

se questo effettivamente copiare costrutti negli elementi, che possono o non possono essere accettabili.

Sulla logica? Nessuna idea. Probabilmente trascurato.

+0

Grazie. Sapevo che dovevo trascurare un modo più semplice. – rkjnsn