Как я могу получить предпоследний элемент в списке?

У меня есть std::list<double> foo;

Я использую

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

но это всегда дает произвольное значение penultimate.

Что я делаю неправильно?

Ответ 1

Вместо уменьшения rbegin вы должны увеличить его, как показано ниже: 1

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

как rbegin() возвращает обратный итератор, поэтому ++ - это оператор, который перемещается назад в контейнере. Заметьте, что я также сбросил лишние круглые скобки: это не для всех.

В настоящее время поведение вашей программы составляет undefined, так как вы фактически переходите к end(), и вам не разрешают разыгрывать это. Произвольный характер вывода является проявлением поведения undefined.


1 Сохраните минимальный размер, который у вас есть.

Ответ 2

Самый ясный способ, на мой взгляд, - использовать конструкцию, предназначенную для этой цели (С++ 11):

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

Ответ 3

Я бы просто сделал *--(--foo.end()); нет необходимости в повторных итераторах. Это менее запутанно.