#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;
С обратными итераторами:
iter = (++n.rbegin()).base()
В качестве примечания: этот метод или метод Чарльза Бейли имеют постоянную сложность, в то время как std :: advance (iter, n.size () - 1);
имеет линейную сложность с список [поскольку он имеет двунаправленные итераторы].
Вы можете написать свои собственные функции для получения предыдущего (и следующего) итератора из заданного (который я использовал, когда мне нужно было «смотреть назад» и «смотреть вперед» с std: : list
):
template <class Iter>
Iter previous(Iter it)
{
return --it;
}
И затем:
std::list<X>::iterator last = previous(li.end());
Кстати, это также может быть доступно в библиотеке ускорения ( next и previous ).
Возьмите конец ()
и пройдите назад.
list <int>::iterator iter = n.end();
cout << *(--iter);
Любой из следующих вариантов вернет std :: 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
к последнему элементу в списке
:
std::list<int>::reverse_iterator iter = std::list::rbegin();