2012-10-31 23 views
9

È possibile creare un std::vector utilizzando i dati preesistenti anziché allocare nuova memoria e copiare i dati?Vettore STL C++ per dati esistenti

Per essere più chiaro, se ho un'area di memoria (o un array c o parte di un altro vettore o qualsiasi altra cosa) e voglio fornire un accesso vettoriale, posso creare un vettore e dirgli di usare questo blocco di memoria?

+1

Come hai intenzione di usare quel vettore? – Andrey

+0

Forse sarà anche meglio non usare affatto 'vector' o contenitori simili. Perché vuoi mettere i tuoi dati in un contenitore separato? –

+1

È importante sapere come si utilizzerà il vettore. Per esempio nella risposta di Luchian, il vettore risultante non sarà un 'vector ', sarà un 'vector '. Quindi se il motivo per cui hai bisogno di un vettore è di passarlo a una funzione che si aspetta un 'vector ', allora questo non ti aiuterà. Se hai bisogno del vettore per qualche altro scopo allora forse ti aiuterà. –

risposta

7

No, ma potresti scrivere la tua classe che fa questo. Dato che questo sarebbe un bisogno abbastanza comune non sarei sorpreso se qualcun altro lo avesse già fatto.

Tuttavia il normale modo C++ sarebbe quello di scrivere il codice del modello per operare su iteratori. È possibile creare iteratori per qualsiasi porzione di un vettore o per qualsiasi porzione di un array C (e molto altro). Quindi scrivere codice modello per gli iteratori è probabilmente quello che dovresti fare.

+1

Perché non dovrebbe funzionare un allocatore personalizzato? –

+0

Puoi spiegarlo un po 'di più? Intendi creare una classe basata su modelli con un'interfaccia vettoriale che accetta gli iteratori al suo costruttore e li usa internamente? – baruch

+1

Perché si dovrebbe provare a reinventare la ruota quando gli allocatori possono fare il lavoro? Il "nuovo" 'vector' può avere il 99% di codice in comune con' std :: vector'. – Acorbe

2

Poiché è possibile utilizzare un allocatore personalizzato durante la creazione di vector, è tecnicamente possibile.

Tuttavia,, non lo consiglio. Mi piacerebbe solo creare un vettore con una dimensione fissa (a quanto pare si può ottenere una sospensione di quello) e quindi utilizzare std::copy.

+0

Cosa succede se l'array esistente ha dimensione 'n', e per qualsiasi motivo il vettore richiede l'allocatore per lo spazio di dimensione' n + 1'? Non sto dicendo che succederà sicuramente, ma sono abbastanza sicuro che lo standard permetta a 'vector' di sovra-allocare con qualunque margine gli piaccia, e di usare lo spazio in eccesso alla fine della sua allocazione per qualunque cosa gli piaccia. Probabilmente potresti scrivere l'allocatore per notare qualcosa di spiacevole e tornare a comportarti come un normale allocatore. –

1

Algoritmi che iterano su un contenitore accettano una coppia di iteratori che definiscono l'intervallo di input. È possibile utilizzare l'algoritmo con iteratori che puntano a metà di un grande contenitore.

Esempi:

std::vector<int> big_vector(100000); 
// initialize it 
//... 
std::sort(big_vector.begin()+100, big_vector.begin()+200); // sort a subrange 

int big_array[100000]; //c-style array 
// initialize it 
//... 
std::sort(std::begin(big_array)+300, std::begin(big_array)+400); // sort a subrange 
Problemi correlati