Esta es probablemente la respuesta que está buscando. Otros han sugerido que no se puede envolver una matriz en un vector, pero eso simplemente no es cierto; ¡piénselo, un vector tiene una matriz ya que es un contenedor de datos subyacente! Había estado intentando esto sin parar durante bastante tiempo antes de encontrar una solución viable. La advertencia es que tienes que poner a cero los punteros después de su uso para evitar duplicar la memoria.
#include <vector>
#include <iostream>
template <class T>
void wrapArrayInVector(T *sourceArray, size_t arraySize, std::vector<T, std::allocator<T> > &targetVector) {
typename std::_Vector_base<T, std::allocator<T> >::_Vector_impl *vectorPtr =
(typename std::_Vector_base<T, std::allocator<T> >::_Vector_impl *)((void *) &targetVector);
vectorPtr->_M_start = sourceArray;
vectorPtr->_M_finish = vectorPtr->_M_end_of_storage = vectorPtr->_M_start + arraySize;
}
template <class T>
void releaseVectorWrapper(std::vector<T, std::allocator<T> > &targetVector) {
typename std::_Vector_base<T, std::allocator<T> >::_Vector_impl *vectorPtr =
(typename std::_Vector_base<T, std::allocator<T> >::_Vector_impl *)((void *) &targetVector);
vectorPtr->_M_start = vectorPtr->_M_finish = vectorPtr->_M_end_of_storage = NULL;
}
int main() {
int tests[6] = { 1, 2, 3, 6, 5, 4 };
std::vector<int> targetVector;
wrapArrayInVector(tests, 6, targetVector);
std::cout << std::hex << &tests[0] << ": " << std::dec
<< tests[1] << " " << tests[3] << " " << tests[5] << std::endl;
std::cout << std::hex << &targetVector[0] << ": " << std::dec
<< targetVector[1] << " " << targetVector[3] << " " << targetVector[5] << std::endl;
releaseVectorWrapper(targetVector);
}
Alternativamente usted podría hacer una clase que hereda de vectores y nulos los punteros a la destrucción:
template <class T>
class vectorWrapper : public std::vector<T>
{
public:
vectorWrapper() {
this->_M_impl _M_start = this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = NULL;
}
vectorWrapper(T* sourceArray, int arraySize)
{
this->_M_impl _M_start = sourceArray;
this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = sourceArray + arraySize;
}
~vectorWrapper() {
this->_M_impl _M_start = this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = NULL;
}
void wrapArray(T* sourceArray, int arraySize)
{
this->_M_impl _M_start = sourceArray;
this->_M_impl _M_finish = this->_M_impl _M_end_of_storage = sourceArray + arraySize;
}
};
Recuerde que usted puede conseguir 'std :: vECTOR' para copiar los elementos devueltos por el array como se muestra a continuación, pero si esta API espera que llame a otra función para liberar memoria asignada para la matriz, o eliminar la matriz usted mismo, debe hacerlo. Crear el vector no liberará esa memoria. – Praetorian
¿Su función API * devuelve * un 'doble *', o toma un puntero como * argumento * y lo llena de datos? –
Kerrek SB // ¡buen punto! algo devuelve un doble * algo tomar un puntero como argumento. – webnoon