2010-09-06 3 views
1

Je voudrais placer les trois dernières valeurs du vecteur v_2 en trois variables (une valeur par variable). Existe-t-il un moyen plus rapide ou plus simple de faire cela?Comment retourner les trois dernières valeurs d'un vecteur?

struct Desempenho { 
double maximo; 
}; 

double ultimo, penultimo, antepenultimo; 
Desempenho d; 
int n (0); 
vector<Desempenho> v_2; 
d.maximo=1.1; 
v_2.push_back(d); 
d.maximo=2.2; 
v_2.push_back(d); 
d.maximo=3.3; 
v_2.push_back(d); 
d.maximo=4.4; 
v_2.push_back(d); 
d.maximo=5.5; 
v_2.push_back(d); 

for (vector<Desempenho>::const_reverse_iterator rit = v_2.rbegin(); rit != v_2.rend(); ++rit) { 
    cout << "XXXX " << n << endl; 
    if (n==0) ultimo = rit->maximo; 
    else if (n==1) penultimo = rit->maximo; 
    else if (n==2) antepenultimo = rit->maximo; 
    else break; 
    ++n; 
    } 

cout << ultimo << " " << penultimo << " " << antepenultimo < < endl; 

Répondre

2

Eh bien, vous n'avez pas besoin d'une boucle à utiliser itérateurs:

vector<Desempenho>::const_reverse_iterator rit = v_2.rbegin(); 
if (rit != v_2.rend()) { 
    ultimo = rit->maximo; 
    if (++rit != v_2.rend()) { 
     penultimo = rit->maximo; 
     if (++rit != v_2.rend()) antepenultimo = rit->maximo; 
    } 
} 

Si vous voulez être inutilement flashy:

size_t len = v_2.size(); 
switch(len) { 
    default: 
     antepenultimo = v_2[len-3].maximo; 
    case 2: 
     penultimo = v_2[len-2].maximo; 
    case 1: 
     ultimo = v_2[len-1].maximo; 
    case 0: 
     break; 
} 

Mais votre code critique va jeter un biro à la tête. Plus raisonnablement, une seule vérification d'erreur peut faire:

size_t len = v_2.size(); 
if (len >= 3) { 
    ultimo = v_2[len-1].maximo; 
    penultimo = v_2[len-2].maximo; 
    antepenultimo = v_2[len-3].maximo; 
} 
1

Vous pouvez obtenir la taille via la méthode size() et sortie avec quelque chose comme ça.

cout << v_2.at(size-1) << v_2.at(size-2) << v_2.at(size-3) 

Si la taille est le résultat de la méthode size().

+0

Ceci déclenche une exception si le vecteur est trop petit, alors que le code original imprime un objet initialisé par défaut. Ou dans cet exemple, un objet non initialisé, mais je supposais que c'était un accident :-) –

+0

Oui, mais cela pourrait être surmonté tout simplement. –

1

Le plus simple qui me vient à l'esprit est 3 affectations. Cependant, vous pouvez faire quelque chose de génial comme ceci:

int ultimo = 0, penultimo = 0, antepenultimo = 0; 
int* ptr[3] = {&ultimo, &penultimo, &antepenultimo}; 
for (int i = 2; i >= 0; i--) 
    if (v_2.size() - i >= 0) 
     *ptr[i] = v_2[i]; 
+0

Très intéressant. Ce serait une bonne technique si vous aviez, disons, 100 variables différentes. –

Questions connexes