69 votes

Comment obtenir l'avant-dernier élément d'une liste ?

J'ai un std::list<double> foo;

J'utilise

if (foo.size() >= 2){
    double penultimate = *(--foo.rbegin());
}

mais cela me donne toujours une valeur arbitraire de penultimate .

Qu'est-ce que je fais de mal ?

67voto

Bathsheba Points 23209

Plutôt que de décrémentation rbegin vous devez l'incrémenter, comme indiqué ici : 1

double penultimate = *++foo.rbegin();

comme rbegin() renvoie un itérateur inverse donc ++ est l'opérateur qui se déplace en arrière dans le conteneur. Notez que j'ai également supprimé les parenthèses superflues : ce n'est pas du goût de tout le monde.

Actuellement, le comportement de votre programme est indéfini puisque vous déménagez en fait à end() et vous n'êtes pas autorisé à le déréférencer. La nature arbitraire de la sortie est une manifestation de ce comportement indéfini.


1 Conservez le contrôle de la taille minimale que vous avez actuellement.

27voto

Gregory Currie Points 570

La façon la plus claire, à mon avis, est d'utiliser la construction conçue à cette fin (C++11) :

double penultimate = *std::prev(foo.end(), 2)

11voto

Mehrdad Points 70493

Je ferais juste *--(--foo.end()) ; pas besoin d'itérateurs inversés. C'est aussi moins déroutant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X