Ответ 1
Да, вы можете вернуться назад. (Предполагая, что вы знаете, что список не пуст.)
std::list<int>::iterator i = n.end();
--i;
#include <list>
using std::list;
int main()
{
list <int> n;
n.push_back(1);
n.push_back(2);
n.push_back(3);
list <int>::iterator iter = n.begin();
std::advance(iter, n.size() - 1); //iter is set to last element
}
Есть ли другой способ иметь итерацию последнего элемента в списке?
Да, вы можете вернуться назад. (Предполагая, что вы знаете, что список не пуст.)
std::list<int>::iterator i = n.end();
--i;
Любое из следующего возвращает std::list<int>::iterator
к последнему элементу в list
:
std::list<int>::iterator iter = n.end();
--iter;
std::list<int>::iterator iter = n.end();
std::advance(iter, -1);
// C++11
std::list<int>::iterator iter = std::next(n.end(), -1);
// C++11
std::list<int>::iterator iter = std::prev(n.end());
Далее возвращается std::list<int>::reverse_iterator
к последнему элементу в list
:
std::list<int>::reverse_iterator iter = std::list::rbegin();
С помощью обратных итераторов:
iter = (++n.rbegin()).base()
В качестве побочного примечания: этот метод Чарльза Бейли имеет постоянную сложность, а std::advance(iter, n.size() - 1);
имеет линейную сложность со списком [поскольку он имеет двунаправленные итераторы].
Возьмите end()
и пройдите назад.
list <int>::iterator iter = n.end();
cout << *(--iter);
std::list<int>::iterator iter = --n.end();
cout << *iter;
Вы можете написать свои собственные функции, чтобы получить предыдущий (и следующий) итератор из данного (который я использовал, когда мне нужно "смотреть" и "смотреть вперед" с помощью std::list
):
template <class Iter>
Iter previous(Iter it)
{
return --it;
}
И затем:
std::list<X>::iterator last = previous(li.end());
BTW, это также может быть доступно в библиотеке boost (далее и ранее).
list<int>n;
list<int>::reverse_iterator it;
int j;
for(j=1,it=n.rbegin();j<2;j++,it++)
cout<<*it;