2011-03-09 16 views
5

Utilizo el siguiente método para obtener un espacio de memoria asignado sin preocuparme por cómo reclamar el recurso asignado.C++ - Obtener un puntero interno a un vector

#include <vector> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    vector<int> vecInts; 

    for(int iInd=0; iInd<10; i++) 
     vecInts.push_back(iInd); 

    int* pInt = &vecInts[0]; // Is this a good method? 

    // now can I use pInt to modify the value of the vecInts? 
    // I will NOT resize the vector and just simply manipulate the values inside 
    return 0; 
} 

Sin embargo, no estoy seguro si este método es bueno o no.

Gracias

Respuesta

5

Sí, está bien dadas las precauciones que usted menciona (y otras que son obvios, como no utilizar un puntero en un vector que se ha ido fuera de alcance, etc.). El puntero será válido e invalidado de la misma manera que un iterador en el contenedor.

+0

¿Podemos llamarlo un truco? Dado que std :: vector no proporciona una función llamada const T * Get? - Gracias – q0987

+2

No, esto no es un truco. Se supone que un vector debe usarse en lugares donde un programa C usaría una matriz. –

+0

No es razonable en mi opinión. Es bien sabido que es seguro, y a veces es útil. Por ejemplo, http://en.wikipedia.org/wiki/Vector_(C%2B%2B) ilustra el uso de dicho puntero con llamadas a 'memcpy' y' printf'. Si te sientes más cómodo con los iteradores, siempre puedes usar uno en su lugar, aunque solo sea para obtener la dirección ala '& (* v.begin())' (igualmente válida solo cuando 'v.size()> 0 ') –

3

Ese es un buen método. La memoria se liberará automáticamente cuando el vector salga del alcance. En las implementaciones modernas de STL vector tiene un método data() que devuelve el puntero al inicio de la memoria, que es equivalente a &v[0], pero se ve mucho más limpio.

Este enfoque también tiene la buena propiedad de que cada elemento se establece en 0 (o construido por defecto si se trata de un objeto).

Para mayor eficiencia, si conoce la longitud del vector de antemano, puede proporcionarlo como un argumento de constructor. Entonces toda la memoria se asignará una vez. P.ej.

vector<char> buffer(bufSize); 
fread(buffer.data(), 1, buffer.size(), file); 

Y, como se menciona en el comentario, tenga en cuenta que buffer.data() cambiará si se cambia el tamaño de la memoria intermedia, y desasignado cuando se sale del ámbito.