Ho una classe che ha (tra le altre cose) un puntatore al char senza segno che viene cancellato e riallocato per memorizzare alcuni dati da un altro array. Questo fatto con una funzioneCome posso fare l'equivalente di memcpy da un array raw a uno std :: vector?
class MyClass {
private:
unsigned char* m_Buffer;
int m_BufferSize;
public:
bool SetBuffer(int iSize, const unsigned char* pArray);
};
bool MyClass::SetBuffer(int iSize, const unsigned char* pArray) {
bool bOK = false;
if (pArray != NULL && iSize > 0) {
delete [] m_Buffer;
m_Buffer = new unsigned char[iSize];
memcpy(m_Buffer,pArray,iSize);
m_BufferSize = iSize;
bOK = true;
}
return bOK;
}
Non mi piace questo codice a tutti, e mi piacerebbe davvero sostituire il puntatore con un std::vector<unsigned char>
. La mia domanda è, come potrei eseguire l'aspetto memcpy? Se stavo passando un vettore come argomento alla mia funzione, potrei copiarlo usando gli iteratori, ma non ho il controllo sul tipo di argomento parametro, quindi sono bloccato con unsigned char*
. C'è un modo di utilizzare gli iteratori o dimensionare il vettore alla giusta dimensione e quindi accedere alla sua matrice interna in modo che possa ancora copiare i dati con memcpy
? O ancora meglio qualcosa usando gli iteratori ?? So che potrei usare un loop e push_back
ma a me sembra dolorosamente inefficiente. Qualsiasi suggerimento sarà accolto con gratitudine.
+1 Soluzione migliore –
Questo ridimensionerà automaticamente il vettore o dovrei chiamare chiaro e impostare la dimensione di esso alla dimensione dell'array? – mathematician1975
@ matematico1975 vedi [qui] (http://en.cppreference.com/w/cpp/container/vector/assign). Non devi chiamare chiaro, ridimensionare o altro. – juanchopanza