Qual è il modo corretto di C++ 11 per estrarre un set di caratteri da un stringing senza usare boost?Come ottenere caratteri da Stringstream senza copiare?
Voglio farlo senza copiare, se possibile, perché dove viene utilizzato è in un ciclo di dati critico. Sembra, tuttavia, std :: string non consenta l'accesso diretto ai dati.
Ad esempio, il codice di seguito esegui una copia sottostringa su uno stringstream:
inline std::string left(std::stringstream ss, uint32_t count) {
char* buffer = new char[count];
ss.get(buffer, count);
std::string str(buffer); // Second copy performed here
delete buffer;
return str;
}
- Dovrei essere anche usare char * buffer avviene C++ 11?
- Come faccio a girare una seconda copia?
La mia comprensione è che i vettori inizializzano ogni carattere, quindi voglio evitarlo.
Inoltre, questo deve essere passato in una funzione che accetta const char *, quindi ora dopo questa esecuzione sono costretto a fare un .c_str(). Ne fa anche una copia?
Sarebbe bello poter restituire un const char *, ma questo sembra andare contro lo stile "corretto" di C++ 11.
di capire quello che sto cercando di fare, qui è "effettivamente" quello che voglio usarlo per:
fprintf(stderr, "Data: [%s]...", left(ststream, 255));
Ma la C++ 11 forze:
fprintf(stderr, "Data: [%s]...", left(str_data, 255).c_str());
Quanti copie di quella stringa sto facendo qui?
Come posso ridurlo a una singola copia fuori dallo stringstream?
'std :: string str (buffer);' causa un comportamento indefinito, 'buffer' non è terminato da null –
hai considerato di passare' ss' per riferimento const anziché per valore? Ciò eliminerebbe una copia. –
dare un 'std :: string' a' fprintf' è un comportamento indefinito in tutte le versioni di C++; questo non è stato modificato da C++ 11 –