2011-04-02 10 views
6

Estoy usando una API de terceros (CryptEncrypt, para ser precisos) que toma una matriz C como parámetro de entrada/salida. Lógicamente, la API se resume en la siguiente función:pasar std :: vector a una función que modifica una matriz de entrada

void add1(int *inout, size_t length) 
{ 
    for(size_t i = 0; i < length; i++) 
    { 
    inout[i] += 1; 
    } 
} 

que estoy tratando de evitar el uso de matrices primas, por lo que mi pregunta es ¿Puedo usar el std :: vector como una entrada a la API de arriba? Algo parecido a lo siguiente:

#include <vector> 
int main() 
{ 
    std::vector<int> v(10); // vector with 10 zeros 
    add1(&v[0], v.size()); // vector with 10 ones? 
} 

¿Puedo usar la garantía 'contigua de almacenamiento' de un vector para escribir datos en ella? Me inclino a creer que esto está bien (funciona con mi compilador), pero me sentiría mucho mejor si alguien más entendido que yo puede confirmar si dicho uso no infringe las garantías estándar de C++. :)

Gracias de antemano!

+2

Uno de los objetivos de diseño de std :: vector era que este ejemplo debería funcionar. – Sjoerd

+3

En el nuevo estándar, incluso hay un miembro 'v.data()' por lo que ya no tiene que escribir '& v [0]' y lo que podría ser más claro que 'add1 (v.data(), v.size()); '! – Sjoerd

+0

gracias a todos por las respuestas y comentarios! –

Respuesta

6

¿Puedo utilizar la garantía de "almacenamiento contiguo" de un vector para escribir datos en él?

Sí.

Me inclino a creer que esto está bien

Su inclinación es correcta.

0

Esto debería funcionar. No veo ningún problema

+0

Has dicho la palabra s. –

3

Como está garantizado que el almacenamiento es contiguo (a partir de la revisión de 2003 de la norma, e incluso antes era casi imposible implementar sensiblemente vector sin usar una matriz debajo del capó), debería estar bien.

2

El almacenamiento está garantizado para ser continuo por el estándar, pero el elemento de acceso [0] en el vector vacío es un comportamiento indefinido por el estándar. Por lo tanto, puede obtener un error en algunos compiladores. (Consulte otra publicación que muestra este problema con Visual Studio 2010 en SO.)

Sin embargo, el estándar ha resuelto esto en C++ 0x.

Cuestiones relacionadas