2010-08-16 20 views
5

Dire che ho il seguente:Può std :: vector essere = 'd in un altro std :: vector?

std::vector<int> myints; 

e poi ho una funzione che restituisce un int vettore:

std::vector<int> GiveNumbers() 
{ 
    std::vector<int> numbers; 
for(int i = 0; i < 50; ++i) 
{ 
    numbers.push_back(i); 
} 

return numbers; 
} 

potrei poi fare:

myints = GiveNumbers(); 

sarebbe fare questo in modo sicuro fai in modo che myint abbia i numeri da 0 a 49 in esso e nient'altro? Farebbe chiaramente ciò che avrebbe potuto essere in myints in precedenza? Se no, qual è il modo giusto per farlo?

Grazie

risposta

7

Sì. Questo è sicuro Copierete i risultati della vostra funzione GiveNumbers() in myints. Potrebbe non essere il modo più efficiente per farlo, ma è sicuro e corretto. Per i vettori di piccole dimensioni, le differenze di efficienza non saranno così grandi.

+1

+1 per avvertire sull'efficienza. – Brian

+2

Non dovrebbe essere inefficiente se il compilatore supporta RVO. – jamesdlin

+1

RVO dovrebbe ridurlo solo dalla copia di twic4e alla copia una volta. –

1

Sì, assegnerà e sarà chiaro che cosa era nel vettore di ricezione in precedenza.

1

Sì, infatti, lo return numbers in GiveNumbers() copia il vettore nello stack.

Quando si utilizza il operator=, si otterrà lo stesso contenuto sul vostro nuovo vettore

+0

Perfetto, grazie! – jmasterx

+0

ho votato per un ottimo commento. Probabilmente non invoca op = nella vita reale a causa delle ottimizzazioni – pm100

1

Come è stato detto, questo è perfettamente sicuro da usare, anche se non è il metodo più efficiente per farlo.

Per risparmiare sulle risorse, potrebbe essere meglio passare il vettore per riferimento e modificarlo direttamente.

void setNumbers(vector<int> &nums) 
{ 
    nums.resize(50); 
    for(int i = 0; i < 50; ++i) 
    { 
     nums[i] = i; 
    } 
} 

Come è stato menzionato anche, l'efficienza non può fare una grande differenza per molto piccoli vettori, ma su vettori più grandi può effettivamente essere sostanziale.

Il risparmio si ottiene modificando il vettore originale sono direttamente in due modi:

  1. risparmio memoria (non la creazione di un vettore temporaneo)
  2. risparmio di velocità (iterazione Solo N volte per impostare il vettore in una passare, piuttosto che prendere un passaggio per impostare il vettore temporaneo e un secondo passaggio per copiarli nell'originale)
+0

Non dovrebbe essere inefficiente se il tuo compilatore supporta RVO, che fa quella trasformazione per te. – jamesdlin

+0

Inoltre, la versione che accetta un argomento di riferimento dovrebbe fare attenzione a chiamare prima 'std :: vector :: clear() 'o controllare che l'argomento in entrata non inizi con più di 50 elementi. – jamesdlin

+0

@jamesdlin: Si noti l'uso di 'nums.resize (50);'. – KevenK