2015-01-30 15 views
7

Voglio estrarre un intervallo di elementi dall'inizio di un array di caratteri e inserirli in una stringa. L'intervallo può essere inferiore o uguale al numero di elementi.Estrai intervallo di elementi dal char array nella stringa

Questo è quello che ho trovato.

// buffer is a std::array<char, 128> 

std::string message; 

for (int i = 0; i < numberToExtract; ++i) 
{ 
    message += buffer.at(i); 
} 

C'è un modo migliore per farlo?

Ho cercato qualcosa come il costruttore di iterator di std :: string. Per esempio. std::string(buffer.begin(), buffer.end()) ma non voglio tutti gli elementi.

Grazie.

+0

Quando si lavora con STL, è spesso una buona idea interrogare i cicli che inizializzano gli oggetti. – Wolf

+1

@Wolf [Non è l'STL] (http://stackoverflow.com/a/5205571/2069064). – Barry

+0

@Barry I [vedi] (https://en.wikipedia.org/wiki/C%2B%2B_Standard_Library). Lo ripeto per * fare attenzione ai contenitori C++ standard inizializzati con cicli for *. – Wolf

risposta

13

Non c'è bisogno di andare fino in fondo a end:

std::string(buffer.begin(), buffer.begin() + numberToExtract) 

o:

std::string(&buffer[0], &buffer[numberToExtract]); 

o utilizza il costruttore che prende un puntatore e una lunghezza:

std::string(&buffer[0], numberToExtract); 
std::string(buffer.data(), numberToExtract); 
+0

Il costruttore con ptr + len sembra essere il più compatto, +1, forse questa variante dovrebbe essere la prima. – Wolf

+0

Grazie. Non so perché non ci ho pensato. – ksl

2

Sei stretta con il secondo esempio, si può fare

std::string(buffer.begin(), buffer.begin() + numberToExtract) 

Questo sta usando l'aritmetica dei puntatori in quanto l'uso di memoria contigua di array.

+0

Grazie. La stessa risposta è arrivata più volte. – ksl

2

Gli iteratori di accesso casuale consentono di eseguire operazioni aritmetiche:

std::string(buffer.begin(), buffer.begin() + numberToExtract); 
+0

Grazie. La stessa risposta è arrivata più volte. – ksl