2012-08-21 7 views
5

Quiero reescribir algún código que usa una gran cantidad de matrices unsigned char, para hacer uso en cambio de los objetos std::vector<unsigned char>. El problema que tengo es que estos se usan actualmente para almacenar los datos que se escribirán en un puerto serie o en un buffer de escritura de socket y las funciones de la biblioteca para hacer esto toman void* o unsigned char*. Un ejemplo de tal función es¿Puedo llamar a funciones que toman un argumento de matriz/puntero usando un std :: vector en su lugar?

WriteToSocketBuffer(unsigned char* pBuffer, int iSize); 

así Actualmente tengo código del formulario

unsigned char* pArray = new unsigned char[iSize]; 
// populate array with data 
WriteToSocketBuffer(pArray,iSize); 
delete [] pArray; 

Mi pregunta es la siguiente: si cambio de clase para tener un std::vector<unsigned char> lugar de una matriz prima puede simplemente llamar a mi función de biblioteca utilizando

std::vector<unsigned char> myVector; 
    WriteToSocketBuffer(&myVector[0],myVector.size()); 

¿se pasa la dirección del primer elemento en el vector actúan de la misma era como pasar en la dirección del primer elemento de una prima array ¿Es esto simple?

+0

En C++ 11 se puede también use std :: array. –

+0

¿Lo has probado? – KRyan

+3

@DragoonWraith, ¿qué tan difícil sería ayudar? Cosas como permitir la representación no contigua pueden romperlo en general y, sin embargo, tener éxito en las pruebas básicas. – AProgrammer

Respuesta

12

Sí, se asegura que los elementos de un vector son contiguos, similares a una matriz.

Referencia:

C++ 03 estándar:[lib.vector] vector plantilla 23.2.4 Clase

......
Los elementos de una vector se almacenan contiguamente, lo que significa que si v es vector<T, Allocator> donde T es un tipo distinto de bool, entonces obedece a la identidad &v[n] == &v[0] + n para todos 0 <= n < v.size()

+0

Pensé que probablemente estaría bien, pero gracias por confirmarlo. – mathematician1975

6

C++ 98 no imponía la asignación contigua de los datos en un std::vector, pero eso es lo que todas las implementaciones conocidas hicieron de todos modos.

A partir de C++ 03, que estaba estandarizado como un requisito, por lo que ahora se requiere, no solo cómo son las cosas.

3

Sí, puede hacerlo, siempre que el búfer nunca esté vacío.

Si el vector está siempre vacío, entonces &buffer[0] es un error, y probablemente se bloqueará a pesar de que la función llamada normalmente no eliminar la referencia al puntero porque el tamaño es 0.

Cuestiones relacionadas