Qual è il modo corretto (ed efficiente) di allegare il contenuto del buffer C (char *
) alla fine di std::vector<char>
?Collegamento di char buffer al vettore <char> in STL
12
A
risposta
30
Quando hai un vector<char>
a disposizione, probabilmente siete meglio chiamare il metodo vector<char>::insert
:
std::vector<char> vec;
const char* values="values";
const char* end = values + strlen(values);
vec.insert(vec.end(), values, end);
Delega al vettore è da preferire ad usare un back_inserter
perché il vettore può quindi decidere la finale dimensione. Lo back_inserter
sarà solo push_back
, causando probabilmente ulteriori riallocazioni.
4
penso che il modo corretto sarebbe quello di
vec.insert(vec.end(),buf,buf+length);
o
std::copy(buf,buf+length,std::back_inserter(vec));
Edit: Ho riordinato due esempi, quindi non è che i commentatori sono sbagliate, sono solo io ;-)
1
Non l'ho compilato, ma dovrebbe essere qualcosa del tipo:
const char string1[] = "a string";
std::vector<char> vData;
vData.insert(vData.end(), string1, string1+strlen(string1));
Mentre il primo è corretto, anche il secondo è meglio, perché il vettore può dedurre che gli iteratori sono iteratori ad accesso casuale e li usa per prenotare in anticipo, risparmiando possibili riallocazioni. – sbi
Vero. Non mi aspetterei molto da questo, però. Ad ogni modo, c'è più di una strada per Roma ;-) –
Mi aspetterei che il secondo fosse migliore, perché molte implementazioni moderne ora ottimizzano casi semplici. Questo è semplice in tre modi: 'vector <>' è un semplice template, 'char *' è un semplice iteratore e 'char' è un semplice POD. – MSalters