Как я могу получить предпоследний элемент в списке?
У меня есть 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()); нет необходимости в повторных итераторах. Это менее запутанно.