A veces es útil utilizar la dirección de inicio de std::vector
y tratar temporalmente esa dirección como la dirección de un búfer asignado regularmente.
Por ejemplo sustituir este:C++: obteniendo la dirección del inicio de un std :: vector?
char* buf = new char[size];
fillTheBuffer(buf, size);
useTheBuffer(buf, size);
delete[] buf;
con esto:
vector<char> buf(size);
fillTheBuffer(&buf[0], size);
useTheBuffer(&buf[0], size);
La ventaja de esto es, por supuesto, que la memoria intermedia se cancela la asignación automática y que no tiene que preocuparse por el delete[]
.
El problema que tengo con esto es cuando el tamaño == 0. En ese caso, la primera versión funciona bien. Un buffer vacío está "asignado" y las funciones subsiguientes no tienen tamaño. Obtienen tamaño == 0.
Sin embargo, la segunda versión falla si size == 0 ya que llamar a buf[0]
puede contener correctamente una afirmación de que 0 < size
.
¿Existe una alternativa a la expresión &buf[0]
que devuelve la dirección del inicio del vector incluso si el vector está vacío?
También consideré usar buf.begin()
pero de acuerdo con la norma, ni siquiera se garantiza que devuelva un puntero.
Esto parece un descuido en la biblioteca de STL. C++ le permite asignar 'new T [0]' y devolver un puntero válido para situaciones como esta, pero la mayoría de las implementaciones del STL se reafirman en caso de que esté asignando ese elemento o algo. – AshleysBrain
¿Cómo sabría la diferencia entre '& buf [0]' y 'buf [0] = 1'? – shoosh