Qual è il modo più semplice per convertire array in vettore?

Qual è il modo più semplice per convertire array in vettore?

void test(vector _array) { ... } int x[3]={1, 2, 3}; test(x); // Syntax error. 

Voglio convertire x da array int a vettore in modo più semplice.

Utilizzare il costruttore vector che accetta due iteratori, si noti che i puntatori sono iteratori validi e utilizzano la conversione implicita dagli array ai puntatori:

 int x[3] = {1, 2, 3}; std::vector v(x, x + sizeof x / sizeof x[0]); test(v); 

o

 test(std::vector(x, x + sizeof x / sizeof x[0])); 

dove sizeof x / sizeof x[0] è ovviamente 3 in questo contesto; è il modo generico per ottenere il numero di elementi in un array. Si noti che x + sizeof x / sizeof x[0] punta un elemento oltre l’ultimo elemento.

Personalmente, mi piace l’approccio C ++ 2011 perché non richiede di usare sizeof() né di ricordare i limiti dell’array se cambi mai i limiti dell’array (e puoi definire la funzione rilevante in C ++ 2003 se Anch’io lo voglio):

 #include  #include  int x[] = { 1, 2, 3, 4, 5 }; std::vector v(std::begin(x), std::end(x)); 

Ovviamente, con C ++ 2011 potresti voler usare comunque gli elenchi di inizializzazione:

 std::vector v({ 1, 2, 3, 4, 5 }); 

I puntatori possono essere utilizzati come qualsiasi altro iteratore:

 int x[3] = {1, 2, 3}; std::vector v(x, x + 3); test(v) 

Stai facendo la domanda sbagliata qui – invece di forzare tutto in un vettore, chiedi come puoi convertire il test per lavorare con gli iteratori invece di uno specifico contenitore. Puoi anche fornire un sovraccarico per mantenere la compatibilità (e gestire altri contenitori allo stesso tempo gratuitamente):

 void test(const std::vector& in) { // Iterate over vector and do whatever } 

diventa:

 template  void test(Iterator begin, const Iterator end) { // Iterate over range and do whatever } template  void test(const Container& in) { test(std::begin(in), std::end(in)); } 

Che ti permette di fare:

 int x[3]={1, 2, 3}; test(x); // Now correct 

( Demo di Ideone )