Non sono riuscito a trovare quella domanda, ed è un problema reale che sto affrontando.Come convertire std :: vector <unsigned char> nel vettore <char> senza copiare?
Ho un'utilità di caricamento file che restituisce std::vector<unsigned char>
contenente l'intero contenuto del file. Tuttavia, la funzione di elaborazione richiede una serie contigua di char
(e che non può essere modificato - è una funzione di libreria). Poiché la classe che sta utilizzando la funzione di elaborazione memorizza comunque una copia dei dati, desidero archiviarla come vector<char>
. Ecco il codice che potrebbe essere un po 'più illustrativo.
std::vector<unsigned char> LoadFile (std::string const& path);
class Processor {
std::vector<char> cache;
void _dataOperation(std::vector<char> const& data);
public:
void Process() {
if (cache.empty())
// here's the problem!
cache = LoadFile("file.txt");
_dataOperation(cache);
}
};
Questo codice non viene compilato, perché (ovviamente) non c'è conversione appropriato. Possiamo essere certi, tuttavia, che il vettore temporaneo avrà la stessa quantità di memoria (IOW sizeof(char) == sizeof(unsigned char)
)
La soluzione ingenua sarebbe quella di iterare sul contenuto di un personaggio temporaneo e castare ogni personaggio. So che in caso normale verrà chiamato il operator= (T&&)
.
Nella mia situazione è sicuro eseguire la reinterpretazione della conversione, perché sono sicuro che leggerò solo caratteri ASCII. Qualsiasi altro personaggio verrebbe catturato comunque in _dataOperation
.
Quindi, la mia domanda è: come convertire correttamente e in modo sicuro il vettore temporaneo in un modo che non comporta alcuna copia?
Se non è possibile, preferirei il modo sicuro di copiare anziché non sicuro. Potrei anche cambiare LoadFile
per restituire vector<char>
o vector<unsigned char>
.
Se si controlla il codice di '_dataOperation', sarà probabilmente più felice nel lungo periodo se lo si fa prendere' vector '. –
zwol
@Zack sfortunatamente, io no. È una funzione di libreria. Modificherò la domanda. –
Non esiste un modo _safe_ –