2009-09-09 6 views

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 ;-)

+0

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

+0

Vero. Non mi aspetterei molto da questo, però. Ad ogni modo, c'è più di una strada per Roma ;-) –

+0

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

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));